xml的解析
-
DOM(jdk自带)
-
SAX(jdk自带)
-
DOM4J(优秀的第三方的解析方案)
-
JDOM(第三方的)
-
PULL(Java安卓开发推荐的解析方式)
-
........
xml中的节点(Node)的分类
-
元素节点(ELEMENT_NODE) 1
-
属性节点(ATTRIBUTE_NODE) 2
-
文本节点(TEXT_NODE) 3
DOM解析
基于dom树的形式解析xml
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
/**
* 使用DOM解析XML
*/
public class DomParseXml {
public static void main(String[] args) throws Exception {
//创建DOM解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//使用dom解析器工厂创建DOM解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//获取整个文档对象
Document document = builder.parse("bookstore.xml");
//获取根节点
Element rootElement = document.getDocumentElement();
//获取子节点
NodeList booksChildNodes = rootElement.getChildNodes();
for (int i = 0; i < booksChildNodes.getLength(); i++) {
Node node = booksChildNodes.item(i);
if (node.getNodeType() != Node.TEXT_NODE) {
Element bookElement = (Element) node;
String id = bookElement.getAttribute("id");
//获取子节点
NodeList childNodes = bookElement.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node item = childNodes.item(j);
if (item.getNodeType() != Node.TEXT_NODE) {
//因为上面类型已经判断过了,所以在此可以直接转换
Element element = (Element) item;
//获取节点内容
String content = element.getTextContent();
System.out.println(id + "===>" + content);
}
}
}
}
}
}
SAX解析
基于事件驱动的解析
/**
* sax解析xml
*/
public class SaxParseXml {
public static void main(String[] args) throws Exception {
//创建Sax解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//使用Sax解析器工厂创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse(new File("bookstore.xml"), new DefaultHandler() {
@Override
public void startDocument() throws SAXException {
System.out.println("文档的开始");
}
@Override
public void endDocument() throws SAXException {
System.out.println("文档的结束");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("元素的开始");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("元素的结束");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println(new String(ch, start, length));
}
});
}
}
Dom解析和Sax解析的区别
-
dom是把整个文档加载到内存中形成树结构,方便解析,但是如果文档太大会耗费资源比较多
-
sax解析不会加载整个文档而是基于事件驱动模型的.
-
文档较小使用dom解析 文件太大使用sax解析
Dom4j解析(主流)
-
不是jdk提供的解析xml的库
-
是开源的一个优秀的xml解析库
-
基于树模型,但是效率比dom快
-
//创建dom4j的解析器
SAXReader saxReader = new SAXReader();
//获取类路径下面的文件最后作为一个流对象
InputStream inputStream = Dom4JParseXml.class.getClassLoader().getResourceAsStream("bookstore.xml");
//解析流对象代表的文件冰箱且返回一个文档对象
Document document = saxReader.read(inputStream);
//获取根节点
Element rootElement = document.getRootElement();
List<Element> bookList = rootElement.elements("book");
for (Element bookElement : bookList) {
String id = bookElement.attributeValue("id");
String name = bookElement.element("name").getText();
String author = bookElement.element("author").getText();
System.out.println(id + "\t" + name + "\t" + author);
}