XML文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
<book id="1">
<name>活着</name>
<author>余华</author>
<year>2012</year>
<price>89</price>
</book>
<book id="2">
<name>平凡的世界</name>
<author>路遥</author>
<year>2015</year>
<price>98</price>
</book>
</bookstore>
1、使用DOM方式解析,代码如下:
package com.lanxuewei.codeonline.demo;
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;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
/**
* 解析xml文件
*/
public class DomTest {
public static void main(String[] args) {
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance(); //创建DocumentBuilderFactory对象
try {
DocumentBuilder db
= dbf.newDocumentBuilder(); //创建DocumentBuilder对象
Document document = db.parse("xmlTest.xml"); //加载xml文件
NodeList bookList = document.getElementsByTagName("book"); //获取book节点集合
System.out.println("bookNum: " + bookList.getLength());
for (int i = 0; i < bookList.getLength(); i++){
System.out.println("---开始遍历第" + (i+1) + "本书---");
Node book = bookList.item(i); //遍历获得book
NamedNodeMap attrs = book.getAttributes(); //获取book属性
for (int j = 0; j < attrs.getLength(); j++){
Node node = attrs.item(j);
System.out.print("属性名:" + node.getNodeName());
System.out.println(",属性值:" + node.getNodeValue());
}
NodeList childNodes = book.getChildNodes(); //获取book节点第子节点
System.out.println("第" + (i+1) +
"本书有" + childNodes.getLength() + "个节点"); //空白处也属于子节点
for (int k = 0; k < childNodes.getLength(); k++){ //获取book子节点属性
if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){
System.out.print("第" + (k+1) + "个节点的节点名:" +
childNodes.item(k).getNodeName());
System.out.println(",节点值:"+
childNodes.item(k).getFirstChild().getNodeValue());
/* System.out.println(",节点值:" + //比较getFirstChild()和getTextContent()
childNodes.item(k).getTextContent());*/
}
}
System.out.println("---结束遍历第" + (i+1) + "本书---");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如下:
2、使用SAX方式解析,代码如下:
(1)Main方法
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
public class SaxTest {
public static void main(String[] args) {
SAXParserFactory saxParserFactory
= SAXParserFactory.newInstance(); //获得SAXParserFactory对象
try {
SAXParser saxParser =
saxParserFactory.newSAXParser(); //获得SAXParser对象
SaxParserHandler saxParserHandler =
new SaxParserHandler(); //获得SaxParserHandler对象
saxParser.parse("xmlTest.xml",saxParserHandler); //解析xml
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)SaxParserHandler
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParserHandler extends DefaultHandler{
int bookIndex = 0;
/**
* 标识解析开始
* @throws SAXException
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("Sax解析开始...");
}
/**
* 标识解析结束
* @throws SAXException
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("Sax解析结束...");
}
/**
* 用来遍历xml文件的开始标签
* @param uri
* @param localName
* @param qName
* @param attributes
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals("book")){ //解析book标签
bookIndex++;
System.out.println("---开始遍历第" + bookIndex + "本书---");
String bookId = attributes.getValue("id");
System.out.println("bookId = " + bookId);
}else if (!qName.equals("bookstore")){ //获取其他节点名
System.out.print("节点名:" + qName);
}
}
/**
* 用来遍历xml文件的结束标签
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals("book")){
System.out.println("---结束遍历第" + bookIndex + "本书---");
}
}
/**
* 获取节点值
* @param ch
* @param start
* @param length
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String value = new String(ch,start,length);
if (!value.trim().equals("")){ //非空属性值才输出
System.out.println(",属性值:" + value);
}
}
}
运行结果如下: