黑马程序员 ---XML编程

来源:互联网 发布:mac 文件打包命令 编辑:程序博客网 时间:2024/04/30 13:22

------- android培训、java培训、期待与您交流! ----------

XML解析技术概述(DOM,SAX,jaxp,dom4j)

l XML解析方式分为两种:domsax

l dom(Document Object Model, 即文档对象模型是 W3C 组织推荐的处理 XML 的一种方式。

l sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

l XML解析器

l CrimsonXerces Aelfred2

l XML解析开发包

l JaxpJdomdom4j

JAXP

JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成

l 在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。

使用JAXP进行DOM解析

l javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

获得JAXP中的DOM解析器

l 调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

l 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

l 调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

DOM编程

l DOM模型(document object model)

l DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)

l 在dom中,节点之间关系如下:

l 位于一个节点之上的节点是该节点的父节点(parent)

l 一个节点之下的节点是该节点的子节点(children) 

l 同一层次,具有相同父节点的节点是兄弟节点(sibling) 

l 一个节点的下一个层次的节点集合是节点后代(descendant)

l 父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor) 

Node对象

l Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档) 

l Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

DOM方式解析XML文件

l DOM解析编程

l 遍历所有节点

l 查找某一个节点

l 删除结点

l 更新结点

l 添加节点

l DOM编程练习

更新XML文档

l javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

l Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:

l javax.xml.transform.dom.DOMSource类来关联要转换的document对象, 

l 用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。

l  Transformer对象通过TransformerFactory获得。

SAX解析

l 在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。

l SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

l SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:

l 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。

l 解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

l 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

Tip:SAX解析

SAX方式解析XML文档

使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf = SAXParserFactory.newInstance();

通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();

通过解析器对象得到一个XML的读取器

XMLReader xmlReader = sp.getXMLReader();

设置读取器的事件处理器

xmlReader.setContentHandler(new BookParserHandler());

解析xml文件

xmlReader.parse("book.xml");

DOM4J解析XML文档

l Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。 

l Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

l 使用Dom4j开发,需下载dom4j相应的jar文件。

Document对象

  DOM4j中,获得Document对象的方式有三种:

1.读取XML文件,获得document对象            

                   SAXReader reader = new SAXReader();
              Document   document = reader.read(new File("input.xml"));

2.解析XML形式的文本,得到document对象.

                   String text = "<members></members>";
              Document document = DocumentHelper.parseText(text);

3.主动创建document对象.

                  Document document = DocumentHelper.createDocument();
             //创建根节点

                  Element root = document.addElement("members");

节点对象

1.获取文档的根节点.

      Element root = document.getRootElement();

2.取得某个节点的子节点.

Element element=node.element(“书名");

3.取得节点的文字

      String text=node.getText();

4.取得某节点下所有名为“member”的子节点,并进行遍历.
  List nodes = rootElm.elements("member");
 
   for (Iterator it = nodes.iterator(); it.hasNext();) {
      Element elm = (Element) it.next();
     // do something
  }

5.对某节点下的所有子节点进行遍历.
     for(Iterator it=root.elementIterator();it.hasNext();){
        Element element = (Element) it.next();
        // do something
     }

6.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");

7.设置节点文字.
 element.setText("29");

8.删除某节点.
//childElm是待删除的节点,parentElm是其父节点

    parentElm.remove(childElm);

9.添加一个CDATA节点.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());

节点对象属性 

1.取得某节点下的某属性
    Element root=document.getRootElement();    
    //属性名name

         Attribute attribute=root.attribute("size");

2.取得属性的文字
    String text=attribute.getText();

 3.删除某属性
 Attribute attribute=root.attribute("size");
 root.remove(attribute);

3.遍历某节点的所有属性
   Element root=document.getRootElement();    
   for(Iterator it=root.attributeIterator();it.hasNext();){
         Attribute attribute = (Attribute) it.next();
         String text=attribute.getText();
         System.out.println(text);
    }

4.设置某节点的属性和文字.
   newMemberElm.addAttribute("name", "sitinspring");

5.设置属性的文字
   Attribute attribute=root.attribute("name");
   attribute.setText("sitinspring");

将文档写入XML文件

1.文档中全为英文,不设置编码,直接写入的形式.
  XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));
  writer.write(document);
  writer.close();

2.文档中含有中文,设置编码格式写入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML编码                   

     format.setEncoding("GBK");       
XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);
writer.close();

Dom4j在指定位置插入节点 

1.得到插入位置的节点列表(list

2.调用list.add(index,elemnent),由index决定element的插入位置。

Element元素可以通过DocumentHelper对象得到。示例代码:

Element aaa = DocumentHelper.createElement("aaa");

aaa.setText("aaa");

List list = root.element("").elements();

list.add(1, aaa);

//更新document

XML Schema

XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性

XML Schema VS DTD

XML Schema符合XML语法结构。 

DOMSAXXML API很容易解析出XML Schema文档中的内容。 

XML Schema对名称空间支持得非常好。 

XML SchemaXML DTD支持更多的数据类型,并支持用户自定义新的数据类型。 

XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。

XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。  

字符串与XML的转换 

1.将字符串转化为XML
 

     String text = "<members> <member>sitinspring</member></members>";
Document document = DocumentHelper.parseText(text);

2.将文档或节点的XML转化为字符串.

     SAXReader reader = new SAXReader();
Document   document = reader.read(new File("input.xml"));            
Element root=document.getRootElement();    

            
String docXmlText=document.asXML();

String rootXmlText=root.asXML();
Element memberElm=root.element("member");
String memberXmlText=memberElm.asXML();

------- android培训、java培训、期待与您交流! ----------

原创粉丝点击