【XML】XML解析方式

XML解析方式:

  1. dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
  2. sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

XML解析器

Crimson、Xerces 、Aelfred2

XML解析开发包

Jaxp、Jdom、dom4j

 

Jaxp

JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成
在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。

使用JAXP进行DOM解析

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

获得JAXP中的DOM解析器

  1. 调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
  2. 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
  3. 调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

DOM编程

DOM模型(document object model)

  • DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
  • 在dom中,节点之间关系如下:
    • 位于一个节点之上的节点是该节点的父节点(parent)
    • 一个节点之下的节点是该节点的子节点(children)
    • 同一层次,具有相同父节点的节点是兄弟节点(sibling)
    • 一个节点的下一个层次的节点集合是节点后代(descendant)
    • 父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)
  • 节点类型
    • Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)
    • Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

DOM方式解析XML文件

  • 遍历所有节点
  • 查找某一个节点
  • 删除结点
  • 更新结点
  • 添加节点

xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <书架>  
  3.     <>  
  4.         <书名 id="1">Java就业培训教程</书名>  
  5.         <作者>redarmy</作者>  
  6.         <售价>39.00元</售价>  
  7.     </>  
  8.     <>  
  9.         <书名>JavaScript网页开发</书名>  
  10.         <作者>redarmy</作者>  
  11.         <售价>28.00元</售价>  
  12.     </>  
  13. </书架>  

 

 

解析xml文件

  1. package net.csdn;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5.   
  6. import javax.xml.parsers.DocumentBuilder;  
  7. import javax.xml.parsers.DocumentBuilderFactory;  
  8. import javax.xml.parsers.ParserConfigurationException;  
  9. import javax.xml.transform.Transformer;  
  10. import javax.xml.transform.TransformerException;  
  11. import javax.xml.transform.TransformerFactory;  
  12. import javax.xml.transform.dom.DOMSource;  
  13. import javax.xml.transform.stream.StreamResult;  
  14.   
  15. import org.junit.Test;  
  16. import org.w3c.dom.Document;  
  17. import org.w3c.dom.Element;  
  18. import org.w3c.dom.Node;  
  19. import org.w3c.dom.NodeList;  
  20. import org.xml.sax.SAXException;  
  21.   
  22.   
  23. public class DomDemo {  
  24.     @Test  
  25.     //遍历  
  26.     public void read() throws ParserConfigurationException, SAXException, IOException{  
  27.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  28.         DocumentBuilder db = factory.newDocumentBuilder();  
  29.         Document document = db.parse("src/book.xml");  
  30.           
  31.         Node root = document.getElementsByTagName("书架").item(0);  
  32.         list(root);  
  33.     }  
  34.   
  35.     private void list(Node node) {  
  36.         // TODO Auto-generated method stub  
  37.         if(node instanceof Element){  
  38.             System.out.println(node.getNodeName());  
  39.         }  
  40.         NodeList list = node.getChildNodes();  
  41.           
  42.         for(int i=0; i<list.getLength(); i++){  
  43.             Node child = list.item(i);  
  44.             list(child);  
  45.         }  
  46.     }  
  47.       
  48.     //读属性  
  49.     @Test  
  50.     public void read1() throws ParserConfigurationException, SAXException, IOException{  
  51.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  52.         DocumentBuilder db = factory.newDocumentBuilder();  
  53.         Document document = db.parse("src/book.xml");  
  54.           
  55.         Element node = (Element) document.getElementsByTagName("书名").item(0);  
  56.         System.out.println(node.getAttribute("id"));  
  57.   
  58.     }  
  59.       
  60.     //添加节点  
  61.     @Test  
  62.     public void insert() throws ParserConfigurationException, SAXException, IOException, TransformerException{  
  63.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  64.         DocumentBuilder db = factory.newDocumentBuilder();  
  65.         Document document = db.parse("src/book.xml");  
  66.           
  67.         //创建节点  
  68.         Element element = document.createElement("优惠价");  
  69.         element.setTextContent("29元");  
  70.         //加入到第一本书  
  71.         Element book = (Element) document.getElementsByTagName("书").item(0);  
  72.         book.appendChild(element);  
  73.         //把添加的书名写到文件中  
  74.         TransformerFactory tff = TransformerFactory.newInstance();  
  75.         Transformer ff = tff.newTransformer();  
  76.         ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));  
  77.   
  78.     }  
  79.       
  80.     //在指定位置添加  
  81.     @Test  
  82.     public void insert1() throws SAXException, IOException, ParserConfigurationException, TransformerException{  
  83.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  84.         DocumentBuilder db = factory.newDocumentBuilder();  
  85.         Document document = db.parse("src/book.xml");  
  86.           
  87.         //创建节点  
  88.         Element element = document.createElement("优惠价");  
  89.         element.setTextContent("29元");  
  90.           
  91.         //获取参考节点  
  92.         Element price = (Element)document.getElementsByTagName("售价").item(0);  
  93.         //加入到第一本书  
  94.         Element book = (Element) document.getElementsByTagName("书").item(0);  
  95.         book.insertBefore(element, price);  
  96.         //把添加的书名写到文件中  
  97.         TransformerFactory tff = TransformerFactory.newInstance();  
  98.         Transformer ff = tff.newTransformer();  
  99.         ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));  
  100.   
  101.     }  
  102.       
  103.     //删除数据  
  104.     @Test  
  105.     public void delect() throws ParserConfigurationException, SAXException, IOException, TransformerException{  
  106.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  107.         DocumentBuilder db = factory.newDocumentBuilder();  
  108.         Document document = db.parse("src/book.xml");  
  109.           
  110.         //获取要删除节点  
  111.         Element element = (Element)document.getElementsByTagName("优惠价").item(0);  
  112.         //获取要删除节点的字节  
  113.         Element parent = (Element) element.getParentNode();  
  114.         parent.removeChild(element);  
  115.         //把添加的书名写到文件中  
  116.         TransformerFactory tff = TransformerFactory.newInstance();  
  117.         Transformer ff = tff.newTransformer();  
  118.         ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));  
  119.     }  
  120.       
  121.     //删除数据  
  122.     @Test  
  123.     public void delect1() throws ParserConfigurationException, SAXException, IOException, TransformerException{  
  124.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  125.         DocumentBuilder db = factory.newDocumentBuilder();  
  126.         Document document = db.parse("src/book.xml");  
  127.           
  128.         //获取要删除节点  
  129.         Element element = (Element)document.getElementsByTagName("售价").item(0);  
  130.         element.getParentNode().getParentNode().removeChild(element.getParentNode());  
  131.         //把添加的书名写到文件中  
  132.         TransformerFactory tff = TransformerFactory.newInstance();  
  133.         Transformer ff = tff.newTransformer();  
  134.         ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));  
  135.     }  
  136.       
  137.     //修改数据  
  138.     @Test  
  139.     public void update() throws ParserConfigurationException, SAXException, IOException, TransformerException{  
  140.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  141.         DocumentBuilder db = factory.newDocumentBuilder();  
  142.         Document document = db.parse("src/book.xml");  
  143.           
  144.         //获取要更新节点  
  145.         Element element = (Element)document.getElementsByTagName("售价").item(0);  
  146.         element.setTextContent("38元");  
  147.         //把添加的书名写到文件中  
  148.         TransformerFactory tff = TransformerFactory.newInstance();  
  149.         Transformer ff = tff.newTransformer();  
  150.         ff.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));  
  151.     }  
  152.       
  153. }  

 

遍历所有节点

读属性

添加节点

在指定位置添加节点

删除某一数据

删除一个表签

修改数据


SAX解析


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

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

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

  • 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
  • 解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
  • 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到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");
  1. package net.csdn;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.xml.parsers.ParserConfigurationException;  
  6. import javax.xml.parsers.SAXParser;  
  7. import javax.xml.parsers.SAXParserFactory;  
  8.   
  9. import org.xml.sax.Attributes;  
  10. import org.xml.sax.SAXException;  
  11. import org.xml.sax.XMLReader;  
  12. import org.xml.sax.helpers.DefaultHandler;  
  13.   
  14. public class SaxDemo {  
  15.   
  16.     /**  
  17.      * @param args  
  18.      */  
  19.     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {  
  20.         //创建工厂  
  21.         SAXParserFactory spf = SAXParserFactory.newInstance();  
  22.         //创建sax解析器  
  23.         SAXParser sp = spf.newSAXParser();  
  24.         //获取读取器  
  25.         XMLReader xmlReader = sp.getXMLReader();  
  26.         //设置事件处理器  
  27.         xmlReader.setContentHandler(new BookContenHandler1());  
  28.         //  
  29.         xmlReader.parse("src/book.xml");  
  30.     }  
  31.       
  32. }  
  33.   
  34. class BookContenHandler1 extends DefaultHandler{  
  35.     @Override  
  36.     public void startElement(String uri, String localName, String qName,  
  37.             Attributes attributes) throws SAXException {  
  38.         System.out.println("<"+qName+">");          
  39.     }  
  40.       
  41.     @Override  
  42.     public void characters(char[] ch, int start, int length)  
  43.             throws SAXException {  
  44.         System.out.println(new String(ch,start,length));  
  45.     }  
  46.   
  47.     @Override  
  48.     public void endElement(String uri, String localName, String qName)  
  49.             throws SAXException {  
  50.         System.out.println("<"+qName+">");  
  51.     }  
  52. }  


 

<书架>

 
<书>

  
<书名>
Java就业培训教程
<书名>

  
<作者>
redarmy
<作者>

  
<售价>
39.00元
<售价>

 
<书>

 
<书>

  
<书名>
JavaScript网页开发
<书名>

  
<作者>
redarmy
<作者>

  
<售价>
28.00元
<售价>

 
<书>


<书架>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值