Schema(有兴趣可以看看):books.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/books"
xmlns:tns="http://www.example.org/books" elementFormDefault="qualified">
<element name="books">
<complexType>
<sequence>
<element name="book" maxOccurs="unbounded">
<complexType>
<all>
<element name="name" minOccurs="0"></element>
<element name="author" minOccurs="0"></element>
<element name="year" minOccurs="0"></element>
<element name="price" minOccurs="0"></element>
<element name="language" minOccurs="0"></element>
</all>
<attribute name="id" type="string" />
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
XML:books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.example.org/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/books books.xsd">
<book id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>安徒生童话</name>
<year>2004</year>
<price></price>
<language>English</language>
</book>
</books>
一、DOM解析
DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
优点:
1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。
2、解析过程中,树结构保存在内存中,方便修改。
缺点:
1、由于文件是一次性读取,所以对内存的耗费比较大。
2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。
代码实例:
public void testDOM() {
//创建DocumentBuilder工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//是否对XML名称空间的支持 node.getNamespaceURI()
factory.setNamespaceAware(true);
try {
//通过DocumentBuilder工厂创建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
//通过DocumentBuilder对象的parser方法加载books.xml文件
Document document = builder.parse("books.xml");
//获取document根节点
Element element = document.getDocumentElement();
//获取更节点下所有的子节点
NodeList books = element.getChildNodes();
for (int i = 0; i < books.getLength(); i++) {
Node node = books.item(i);
if ("book".equals(node.getNodeName()) || "book".equals(node.getLocalName())) {
System.out.println("id=" + node.getAttributes().getNamedItem("id").getNodeValue());
NodeList children = node.getChildNodes();
for (int j = 0; j < children.getLength(); j++) {
Node child = children.item(j);
if (child.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(child.getNodeName() + "=" + child.getTextContent());
}
}
System.out.println();
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
二、SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
优点:
1、采用事件驱动模式,对内存耗费比较小。
2、适用于只处理XML文件中的数据时。
缺点:
1、编码比较麻烦。
2、很难同时访问XML文件中的多处不同数据。
代码实例:
public void testSAX() {
//创建SAXParser工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//通过SAXParser工厂创建SAXParser
SAXParser parser = factory.newSAXParser();
//解析xml文件 DefaultHandler为xml文件解析处理器
parser.parse("books.xml", new DefaultHandler() {
private boolean isElementNode;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if ("books".equals(qName) || "books".equals(localName)) {
} else if ("book".equals(qName) || "book".equals(localName)) {
System.out.println("id=" + attributes.getValue("id"));
} else {
isElementNode = true;
System.out.print(qName + "=");
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String value = new String(ch, start, length).trim();
if (isElementNode) {
System.out.println(value);
isElementNode = false;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("book".equals(qName) || "book".equals(localName)) {
System.out.println();
}
}
});
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
三、JDOM解析
特征:1、仅使用具体类,而不使用接口。2、API大量使用了Collections类
优点:1 是基于树的处理XML的Java API,把树加载在内存中
2 没有向下兼容的限制,因此比DOM简单
3 速度快,缺陷少
4 具有SAX的JAVA规则
缺点:1 不能处理大于内存的文档
2 JDOM表示XML文档逻辑模型。不能保证每个字节真正变换。
3 针对实例文档不提供DTD与模式的任何实际模型。
4 不支持与DOM中相应遍历包
代码示例:
public void testJDOM(){
//实例化SAXBuilder
SAXBuilder builder=new SAXBuilder();
try {
//构建document
org.jdom.Document document=builder.build(new File("books.xml"));
//获取document 根节点
org.jdom.Element root=document.getRootElement();
List<org.jdom.Element> elements=root.getChildren();
for(org.jdom.Element book:elements){
System.out.println("id="+book.getAttributeValue("id"));
List<org.jdom.Element> attrElements= book.getChildren();
for(org.jdom.Element attrElement:attrElements){
System.out.println(attrElement.getName()+"="+attrElement.getValue());
}
System.out.println();
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
4、DOM4J解析
特征:
1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。
2、它使用接口和抽象基本类方法。
3、具有性能优异、灵活性好、功能强大和极端易用的特点。
4、开源
public void testDOM4J(){
SAXReader reader=new SAXReader();
try {
org.dom4j.Document document=reader.read("books.xml");
org.dom4j.Element root=document.getRootElement();
for(org.dom4j.Element book:(List<org.dom4j.Element>)root.elements()){
System.out.println("id="+book.attributeValue("id"));
List<org.dom4j.Element> attrElements= book.elements();
for(org.dom4j.Element attrElement:attrElements){
System.out.println(attrElement.getName()+"="+attrElement.getStringValue());
}
System.out.println();
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
网页解析
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
public void testJSOUP(){
try {
//解析网页文件,这里只是做演示(XML解析大材小用了)
org.jsoup.nodes.Document document=Jsoup.parse(new File("books.xml"), "utf-8");
List<org.jsoup.nodes.Element> books=document.getElementsByTag("book");
for(org.jsoup.nodes.Element book:books){
System.out.println("id="+book.attr("id"));
List<org.jsoup.nodes.Element> nodes=book.children();
for(org.jsoup.nodes.Element node:nodes){
System.out.println(node.nodeName()+"="+node.text());
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}