Java学习笔记之Xml

7.Xml

Xml
====================================
  * 可扩展的标记语言
  * 结构化的数据
  * 不用来展示数据
  * 作用:
        *)存储数据
        *)传输数据


Xml 语法
====================================
  1.头标签
    <?xml version="1.0" encoding="GBK"?>

      必须是第一个字节

  2.根元素,只能有一个

  3.元素必须有结束标签

      <a> </a>

      <a />

  4.元素必须正确嵌套

      <a>
          <b>
          </b>
      </a>

  5.属性,必须有值
  6.属性值,必须有引号

      <a k1="v'1" k2='v"2' k3="v3">

  7.转义实体

      <   &lt;
      >   &gt;
      "   &quot;
      '   &apos;
      &   &amp;

  8.<![CDATA[...]]>

      计算机提取cdata块中的文本时,
      不做任何运算处理,所有字符
      作为普通字符提取出来

  9.<!--  注释  -->







标签 Tag
=====================================
  * 一对尖括号

      <a>   a的开始标签

      </a>  a的结束标签


元素 Element
=====================================
  * 包含从开始标签到结束标签全部内容

      to元素:

      <to>
            <to-email>bbb@bbb.com</to-email>
            <to-email>ccc@ccc.com</to-email>
            <to-email>ddd@ddd.com</to-email>
        </to>


文本 Text
=====================================
  * 开始标签和结束标签之间的文本内容

      <a>owhgoshdofwheowong</a>


属性 Attribute
=====================================
  * 开始标签中的键值对

      <a k1="v1">







java 处理xml的API
==========================================
  * SAX
  * XML PULL







SAX
========================================
  * Simple API for XML

  * SAXParserFactory
    SAXParser
    DefaultHandler


  SAXParserFactory
  ---------------------------------
    * sax 解析器工厂对象,
      负责创建 sax 解析器

    创建对象
    -------------------------------
      SAXParserFactory f =
        SAXParserFactory.newInstance();

    方法
    -------------------------------
      newSAXParser()

        新建解析器对象



  SAXParser
  ---------------------------------------
    方法
    --------------------------------
      parse(文件, 数据处理器)

          读取并从文件提取数据,
          将数据传递到处理器进行处理


  DefaultHandler
  --------------------------------------
    * 数据处理器父类

    方法
    ---------------------------------
      startElement()
      endElement()
      characters()







XML PULL
=============================================
  * 第三方开源 API
  * Android 开发库中,集成了 Xml pull

  * XmlPullParserFactory
    Xml
    XmlPullParser
    XmlSerializer



  XmlPullParserFactory
  ----------------------------------------
    * 用来创建解析器对象,
      和序列化器对象的工厂

    创建对象
    -------------------------------------
      XmlPullParserFactory f
        XmlPullParserFactory.newInstance();

    方法
    -------------------------------------
      newXmlPullparser()
      newXmlSerializer()


  Xml
  -------------------------------------
    * 代替工厂的辅助工具类

    方法
    ---------------------------------
      Xml.newXmlPullparser()
      Xml.newXmlSerializer()


  XmlPullparser
  -----------------------------------------
    * 解析器,用来读取、解析 xml 文档

    方法
    ------------------------------------
      setInput(Reader in)
      setInput(InputStream in, String encoding)
        设置输入流,
        从指定的流,读取 xml 数据

        必须首先调用

      next()
        跳到下一段,返回表示数据类型的整数代码

        结束后,再向后跳,返回 XmlPullParser.END_DOCUMENT = 1

      getEventType()
        返回当前位置的数据类型代码

      getName()
        获得标签名

        数字类型代码是:
            XmlPullParser.START_TAG
            XmlPullParser.END_TAG
        才能调用

      getText()
        获得文本

        数字类型代码是:
            XmlPullParser.TEXT
        才能调用

      nextText()
        向后跳一步,并取出文本

        数字类型代码是:
            XmlPullParser.START_TAG
        才能调用

      getAttributeCount()
        获得属性数量
      getAttributeName(index)
        获得指定位置的属性名
      getAttributeValue(index)
        获得指定位置的属性值
      getAttributeValue(namespace, name)
        根据属性名获得它对应的值
        namespace,如果没有,给null值

        数字类型代码是:
            XmlPullParser.START_TAG
        才能调用属性处理方法




  XmlSerializer
  ------------------------------------------
    * 序列化器,
      将数据变成xml格式的字符序列输出

    方法
    ------------------------------------
      setOutput(Writer out)
      setOutput(OutputStream out, String encoding)
        设置用来输出数据的输出流

        必须首先调用

      startDocument(字符编码, 是否独立文件)
        输出 xml 头标签
        <?xml version="1.0"
              encoding="GBK"
              standalone="yes"?>

      startTag(namespace, name)
        输出开始标签
      attribute(namespace, name, value)
        输出属性
      text(String text)
        输出文本
      endTag(namespace, name)
        输出结束标签

      cdsect(String text)
        输出 <![CDATA[]]> 块
      comment(String text)
        输出 <!--  注释  -->




XML解析:
 SAX解析
 DOM解析
   把整篇文档都读入到内存中,生成一个dom树对象。
   [Document对象],我们可以使用各种dom操作相关
   的API方法解析xml文档中的数据。
 PULL解析
   流式解析,边读取边解析。
   当读取的过程中遇到了解析事件,那么将会执行
   我们所编写的解析代码获取相应数据,然后继续
   向后驱动事件,继续解析后续文档。
   

解析特点:
1>有时候需要解析一篇完整文档。
2>有时候只需要获取文档中的一小部分数据。
3>有时候文档数据量很大
4>有时候文档的数据量不大




使用dom4j.jar文件 解析xml文档

常用API:
SAXReader reader;
  reader.read();
Document
  getRootElement()
Element
  getName()
  getText()
  elements()
  elements("book")
  getAttibuteValue()
  ......


private void parseXML_DOM4J() throws Exception {
//1 导入jar包
//2 获取Document文档对象 封装整篇xml
SAXReader reader = new SAXReader();
//以流的方式读取assets目录下的内容
InputStream is = getAssets().open("books.xml");
Document doc = reader.read(is);
//3 使用document的方法 解析文档
//获取根元素
Element root = doc.getRootElement();
//获取books元素的所有子元素
List<Element> eles = root.elements();
//遍历所有子元素
for(Element e : eles){
//每一个e 描述了一个book元素
Log.i("info", "标签名:"+e.getName()+" 属性:"+e.attributeValue("lang"));
//获取book元素中的所有子元素
List<Element> es = e.elements();
for(Element c : es){
Log.i("info", "标签名:"+c.getName() + "标签内容:"+c.getText());
}
}
}




使用Pull的方式解析XML
 流式解析,边读取边解析。
 当读取的过程中遇到了解析事件,那么将会执行
 我们所编写的解析代码获取相应数据,然后继续
 向后驱动事件,继续解析后续文档。

使用pull解析的方式在整个解析过程中将会遇到
很多的解析事件:
 XmlParser.START_DOCUMENT  遇到了文档开始
 XmlParser.END_DOCUMENT    遇到了文件结束
 XmlParser.START_TAG       遇到了开始标签
 XmlParser.END_TAG         遇到了结束标签
 

实现步骤:
XmlPullParser parser=Xml.newPullParser();
parser.setInput(is, "utf-8");
int event=parser.getEventType();
while(event!=XmlPullParser.END_DOCUMENT){
  switch(event){
   case  XmlParser.START_DOCUMENT  遇到了文档开始
   case  XmlParser.START_TAG       遇到了开始标签
    if(tag == "name"){}
    else if(tag == "book"){}
    ......
   case  XmlParser.END_TAG         遇到了结束标签
  }
  //向后继续驱动事件 解析后续文档内容
  event=parser.next();
}


private void parseXML_PULL()throws Exception{
XmlPullParser parser = Xml.newPullParser();
InputStream is = getAssets().open("books.xml");
parser.setInput(is , "utf-8");
//获取事件类型
int event = parser.getEventType();
List<Book> books = new ArrayList<Book>();
Book book = null;
while(event != XmlPullParser.END_DOCUMENT){
//解析当前事件
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
String tag = parser.getName(); //标签名
if(tag.equals("book")){ //碰到了book
book = new Book();
}else if(tag.equals("name")){ //碰到了name
book.setName(parser.nextText());
}else if(tag.equals("isbn")){ //碰到了isbn
book.setIsbn(parser.nextText());
}else if(tag.equals("author")){ //碰到了author
book.setAuthor(parser.nextText());
}else if(tag.equals("price")){ //碰到了price
book.setPrice(parser.nextText());
}else if(tag.equals("publish_time")){ //碰到了publish_time
book.setPublishTime(parser.nextText());
}else if(tag.equals("description")){ //碰到了description
book.setDescription(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
tag = parser.getName();
if(tag.equals("book")){
books.add(book);
}
break;
}
//继续向后驱动事件 解析后续文档
event = parser.next();
}
Log.i("info", ""+books);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值