Java中对xml的解析

Posted 鹤少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中对xml的解析相关的知识,希望对你有一定的参考价值。

 

Java中对xml的解析

1.Dom4j

Dom解析原理:xml解析器一次性将xml文档加载到内存中,然后在内存中构建一颗Document对象树。在通过Document对象得到树上的节点对象,通过节点对象操作文档内容。

 Dom4J 常用的对象: 

 SAXReader:读取 xml 文件到 Document 树结构文件对象 

 Document:是一个 xml 文档对象树,类比 html 文档对象。 

 Element:元素节点。通过 Document 对象可以查找单个元素 

 

使用步骤:

导入 Dom4J.jar 包 dom4j-1.6.1.jar )

1.创建SaxReader解析器

          SAXReader Reader = new SAXReader();

2.通过read方法获得Document对象

          Document document = Reader.read("conf/student.xml");
3.获得根节点

  Element rootEle = document.getRootElement();

4.4.通过迭代器遍历xml文档

Iterator it = rootEle.elementIterator();

while (it.hasNext()) {

Element stusEle = (Element) it.next();

Iterator it01 = stusEle.elementIterator();

while (it01.hasNext()) {

Element stuEle = (Element) it01.next();

System.out.println(stuEle.getStringValue());

}

System.out.println("--------------------------------");

}

Dom4j官方文档中有quick start 可以帮助我们快速使用该技术!

 

 

2.SAX

Sax解析工具是sun公司提供的,内至于jdk中。Org.xml.sax.*;

sax解析原理:事件驱动,边读边写

 

当遇到开始标签时,自动调用startElement(String url,String localName,String qname,Attribute attribute)方法;当遇到文本时,自动执行characters(char[]ch,int start,int length);当遇到结束标签时自动执行endElement(String url,String localName,String qName)方法。

<结束标签以’/’作为标志,结束方法比开始方法只少一个attribute 参数>

 

使用步骤:

1.创建解析工厂

//SAXParserFactory 构造方法被保护,只能通过 .newInstance()方法创建实例

SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();

2.创建解析器

//通过工厂创建解析器

SAXParser saxParser = saxParserFactory.newSAXParser();

3.执行parser方法

// 执行 parser 方法,传入两个参数:xml 文件路径、事件处理器 

saxParser.parse("conf/student.xml", new MyDefaultHandler());

所谓事件处理器是指 一个继承与 DefaultHandler 的类,进行重写其中的startElement()characters()endElement()方法实现相应的处理。

 创建一个类,继承 DefaultHander 类,重写三个方法: 

A、 startElement 获取开始标签,重要的两个参数说明 

a、 qName:把标签名称返回 

b、 attributes:返回标签中的属性对象 

B、 character  获取标签文本内容 

C、 endElement  获取结束标签  

 

============DOM解析    vs   SAX解析 ========

DOM解析

SAX解析

原理: 一次性加载xml文档,不适合大容量的文件读取

原理: 加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(NodeElementAttribute,Java开发者编码比较简单。

SAX解析基于事件的编程方法。java开发编码相对复杂。

 

3.XPath 

主要是用于快速获取所需的节点对象。

选择节点:XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着

路径或者 step 来选取的。下面列出了最有用的路径表达式: 

表达式 描述 

nodename  选取此节点的所有子节点。 

/  从根节点选取。 

//      从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 

.  选取当前节点。 

..  选取当前节点的父节点。 

@  选取属性。   

 

text()获取节点的文本内容函数 

使用步骤:

// 1.通过DocumentBuilderFactor创建解析工厂

DocumentBuilderFactory builderFactory = DocumentBuilderFactory

.newInstance();

// 2.通过工厂获得解析器

DocumentBuilder builder = builderFactory.newDocumentBuilder();

// 3.通过parser方法获取Document

Document document = builder.parse("conf/books.xml");

// 4.获取xpath对象

XPath xpath = XPathFactory.newInstance().newXPath();

// 5.获取 bookstore 节点下 book 属性 category 值为 web 下的第二个title 节点的文本内容

String exp = "/bookstore/book[@category=‘web‘][2]/title/text()";

String tit = (String) xpath.evaluate(exp, document,

XPathConstants.STRING);

System.out.println(tit);

// 获取 bookstore 节点下 book 属性 category 值为 web 的 titile 属性为 en 的节点内容

String expEn = "/bookstore/book[@category=‘web‘]/title[@lang =‘en‘]/text()";

String titEN = (String) xpath.evaluate(expEn, document,

XPathConstants.STRING);

System.out.println(titEN);

// 获取 bookstore 下 book 属性 category 值为 cooking 的 title 的 lang 属性的值

String expLan = "/bookstore/book[@category=‘cooking‘]/title/@lang";

String lang = (String) xpath.evaluate(expLan, document,

XPathConstants.STRING);

System.out.println(lang);

 

// 获取 bookstore 节点下所有 book 的节点集合(遍历该文档)

String expB = "/bookstore/book";

NodeList books =(NodeList) xpath.evaluate(expB, document, XPathConstants.NODESET);

for (int i = 0; i < books.getLength(); i++) {

Element book =(Element) books.item(i);

String title =(String) xpath.evaluate("title/text()", book, XPathConstants.STRING);

String author =(String) xpath.evaluate("author/text()", book, XPathConstants.STRING);

String year =(String) xpath.evaluate("year", book, XPathConstants.STRING);

String price =(String) xpath.evaluate("price", book, XPathConstants.STRING);

System.out.println(title+" "+author+" "+year+" "+price);

System.out.println("----------------------------------------------------");

}

 

4.在Dom4j中使用XPath

开发中Dom4jXPath结合使用非常灵活,所以应用广泛!

使用步骤:

1)导入xPath支持jar包 。  jaxen-1.1-beta-6.jar

2)使用xpath方法

List<Node>  selectNodes("xpath表达式");   查询多个节点对象

Node       selectSingleNode("xpath表达式");  查询一个节点对象

                //1.SAXReader解析器

SAXReader reader = new SAXReader();

//2.通过read方法获得Document

Document document =reader.read("conf/bookstore.xml");

//3.xpath路劲

String titlePath ="/bookstore/book[1]/title";

Element element  =(Element) document.selectObject(titlePath);

String title =element.getStringValue();

System.out.println(title);

以上是关于Java中对xml的解析的主要内容,如果未能解决你的问题,请参考以下文章

JS中对JOSN的解析

Java 6 中对 xinclude 的默认支持?

spring AOP解析之xml方式详解

java解析xml的几种方式哪种最好?

在java中解析xml有哪几种方法

java解析xml的几种方式哪种最好?