JAVA解析XML文件

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具体可参阅w3c官方网站文档http://www.w3.org获取更多信息。

XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<employees>

    <employee name="zansan">
        <age>30</age>
    </employee>
    
    <employee name="lisi">
        <age>20</age>
    </employee>
    
    <employee name="wangwu">
        <age>25</age>
    </employee>
    
</employees>

DOM生成和解析XML文档

为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。

代码:

 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 
 4 import javax.xml.parsers.DocumentBuilder;
 5 import javax.xml.parsers.DocumentBuilderFactory;
 6 import javax.xml.parsers.ParserConfigurationException;
 7 
 8 import org.w3c.dom.Document;
 9 import org.w3c.dom.Element;
10 import org.w3c.dom.Node;
11 import org.w3c.dom.NodeList;
12 import org.xml.sax.SAXException;
13 
14 public class TestXmlDom {
15     public static void main(String[] args) {
16         try {
17             //1 创建解析器工厂对象
18             DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
19             //2 由解析器工厂对象创建解析器对象
20             DocumentBuilder db = dbf.newDocumentBuilder();
21             //得到xml文件的文件流
22             InputStream is=TestXmlDom.class.getResourceAsStream("test.xml");
23             //3 由解析器对象对指定XML文件进行解析,构建相应DOM树,创建Document对象
24             Document doc=db.parse(is);
25             is.close();
26             //获得employee节点集合
27             NodeList nodeList=doc.getElementsByTagName("employee");
28             
29             //得到employee节点的属性
30             for(int i=0;i<nodeList.getLength();i++){
31                 Element e=(Element)nodeList.item(i);
32                 String attribute = e.getAttribute("name");
33                 System.out.println(attribute);
34             }
35             
36             //得到age节点的值
37             for(int i=0;i<nodeList.getLength();i++){
38                 Node employeeNode=nodeList.item(i);
39                 //得到age节点
40                 Node ageNode=employeeNode.getFirstChild().getNextSibling();
41                 System.out.println(ageNode.getFirstChild().getNodeValue());
42             }
43             
44         } catch (ParserConfigurationException e) {
45             e.printStackTrace();
46         } catch (SAXException e) {
47             e.printStackTrace();
48         } catch (IOException e) {
49             e.printStackTrace();
50         }
51     }
52 }

DOM4J生成和解析XML文档

DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。

要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/

dom4j官方网站就是址蛋,找半天找不包下载地址,可以下面地址下载:http://sourceforge.net/projects/dom4j/

下载解开后把dom4j-1.6.1.jar加入工程就可以了.

代码:

 1 import java.io.InputStream;
 2 import java.util.List;
 3 
 4 import org.dom4j.Document;
 5 import org.dom4j.DocumentException;
 6 import org.dom4j.Element;
 7 import org.dom4j.io.SAXReader;
 8 
 9 
10 public class TestXmlDom4J {
11     public static void main(String[] args) {
12         try {
13             //创建SAXReader对象
14             SAXReader reader=new SAXReader();
15             //得到XML文件的文件流
16             InputStream in=TestXmlDom4J.class.getResourceAsStream("test.xml");
17             //注意:Document对象是org.dom4j包下的Document.通过SAXReader对象的read(InputStream)方法得到Document对象
18             Document document=reader.read(in);
19             //获得根元素.注意:Element是org.dom4j包下的Element
20             Element root=document.getRootElement();
21             //获得employee元素集合
22             List<Element> employeeElements=root.elements("employee");
23             //遍历employeeElements得到属性name的值
24             for(Element e:employeeElements){
25                 String name=e.attributeValue("name");
26                 System.out.println(name);
27             }
28             //遍历employeeElements得到age元素的值
29             for(Element e:employeeElements){
30                 //得到age元素
31                 Element a=e.element("age");
32                 //得到age元素的值
33                 String age=a.getText();
34                 System.out.println(age);
35             }
36         } catch (DocumentException e) {
37             // TODO Auto-generated catch block
38             e.printStackTrace();
39         }
40     }
41 }