java怎么解析xml文件?

Python012

java怎么解析xml文件?,第1张

String xml="<xml><ToUserName><![CDATA[toUser]]></ToUserName>"

+"<FromUserName><![CDATA[fromUser]]></FromUserName>"

+"<CreateTime>12345678</CreateTime>"

+"<MsgType><![CDATA[text]]></MsgType>"

+"<Content><![CDATA[你好]]></Content></xml>"

try {

//加载xml字符串

org.dom4j.Document document=org.dom4j.DocumentHelper.parseText(xml)

//获取根节点

org.dom4j.Element root=document.getRootElement()

//获取值  ==toUser

String toUserName=root.elementText("ToUserName")

System.out.println(toUserName)

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace()

}

DOM(Document Object Model)解析

优点

允许应用程序对数据和结构做出更改

访问是双向的,可以在任何时候在树中上、下导航获取、操作任意部分的数据

缺点

解析XML文档的需要加载整个文档来构造层次结构,消耗内存资源大。

应用范围

遍历能力强,常应用于XML文档需要频繁改变的服务中。

解析步骤

创建一个 DocumentBuilderFactory 对象

创建一个 DocumentBuilder 对象

通过 DocumentBuilder 的 parse() 方法加载 XML 到当前工程目录下

通过 getElementsByTagName() 方法获取所有 XML 所有节点的集合

遍历所有节点

通过 item() 方法获取某个节点的属性

通过 getNodeName() 和 getNodeValue() 方法获取属性名和属性值

通过 getChildNodes() 方法获取子节点,并遍历所有子节点

通过 getNodeName() 和 getTextContent() 方法获取子节点名称和子节点值

package Paint

import java.io.IOException

import javax.xml.parsers.DocumentBuilder

import javax.xml.parsers.DocumentBuilderFactory

import javax.xml.parsers.ParserConfigurationException

import org.w3c.dom.Document

import org.w3c.dom.NamedNodeMap

import org.w3c.dom.Node

import org.w3c.dom.NodeList

import org.xml.sax.SAXException

public class DOMTest {

public static void main(String[] args) {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance()

try {

DocumentBuilder db = dbf.newDocumentBuilder()

Document document = db.parse("./src/Paint/hello.xml")

NodeList bookList = document.getElementsByTagName("book")//节点集

int bookCnt = bookList.getLength()

System.err.println("一共获取到" + bookCnt +"本书")

for(int i=0iNode book = bookList.item(i)

NamedNodeMap attrs = book.getAttributes()

for(int j=0jNode attr = attrs.item(j)

System.err.println(attr.getNodeName()+"---"+attr.getNodeValue())//id

}

NodeList childNodes = book.getChildNodes()

for(int k=0kif(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){

System.out.println(childNodes.item(k).getNodeName()+"---" + childNodes.item(k).getTextContent())

}

}

}

} catch (ParserConfigurationException e) {

e.printStackTrace()

} catch (SAXException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

}

}

}

SAX(Simple API for XML)解析

优点

不需要等待所有的数据被处理,解析就可以开始

只在读取数据时检查数据,不需要保存在内存中

可以在某一个条件满足时停止解析,不必要解析整个文档

效率和性能较高,能解析大于系统内存的文档

缺点

解析逻辑复杂,需要应用层自己负责逻辑处理,文档越复杂程序越复杂

单向导航,无法定位文档层次,很难同时同时访问同一文档的不同部分数据,不支持 XPath

解析步骤

获取一个 SAXParserFactory 的实例

通过 factory() 获取 SAXParser 实例

创建一个 handler() 对象

通过 parser 的 parse() 方法来解析 XML

SAXTest.java

package Paint

import java.io.IOException

import javax.xml.parsers.ParserConfigurationException

import javax.xml.parsers.SAXParser

import javax.xml.parsers.SAXParserFactory

import org.xml.sax.SAXException

public class SAXTest {

public static void main(String[] args) {

// 获取实例

SAXParserFactory factory = SAXParserFactory.newInstance()

try {

SAXParser parser = factory.newSAXParser()

SAXParserHandler handler = new SAXParserHandler()

parser.parse("./src/Paint/hello.xml", handler)

System.err.println("共有"+ handler.getBookList().size()+ "本书")

for(Book book : handler.getBookList()){

System.out.println(book.getName())

System.out.println("id=" + book.getId())

System.out.println(book.getAuthor())

System.out.println(book.getYear())

System.out.println(book.getPrice())

System.out.println(book.getLanguage())

}

} catch (ParserConfigurationException e) {

e.printStackTrace()

} catch (SAXException e) {

e.printStackTrace()

} catch (IOException e) {

e.printStackTrace()

}

}

}

SAXParserHandler.java

package Paint

import java.util.ArrayList

import org.xml.sax.Attributes

import org.xml.sax.SAXException

import org.xml.sax.helpers.DefaultHandler

public class SAXParserHandler extends DefaultHandler {

String value = null

Book book = null

private ArrayList bookList = new ArrayList()

public ArrayList getBookList() {

return bookList

}

/*

* XML 解析开始

*/

public void startDocument() throws SAXException {

super.startDocument()

System.out.println("xml 解析开始")

}

/*

* XML 解析结束

*/

public void endDocument() throws SAXException {

super.endDocument()

System.out.println("xml 解析结束")

}

/*

* 解析 XML 元素开始

*/

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

super.startElement(uri, localName, qName, attributes)

if(qName.equals("book")){

book = new Book()

for(int i=0iSystem.out.println(attributes.getQName(i)+"---"+attributes.getValue(i))

if(attributes.getQName(i).equals("id")){

book.setId(attributes.getValue(i))

}

}

}else if(!qName.equals("bookstore")){

System.out.print("节点名:"+ qName + "---")

}

}

/*

*解析 XML 元素结束

*/

public void endElement(String uri, String localName, String qName)

throws SAXException {

super.endElement(uri, localName, qName)

if(qName.equals("book")){

bookList.add(book)

book = null

}

else if(qName.equals("name")){

book.setName(value)

}else if(qName.equals("year")){

book.setYear(value)

}else if(qName.equals("author")){

book.setAuthor(value)

}else if(qName.equals("price")){

book.setPrice(value)

}else if(qName.equals("language")){

book.setLanguage(value)

}

}

public void characters(char[] ch, int start, int length)

throws SAXException {

super.characters(ch, start, length)

// 获取节点值数组

value = new String(ch, start, length)

if(!value.trim().equals("")){

System.out.println("节点值:"+value)

}

}

}