1.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);
}
}
}
}
}
}
**2.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)); } });
}
}
3. Dom解析和Sax解析的区别
- dom是把整个文档加载到内存中形成树结构,方便解析,但是如果文档太大会耗费资源比较多
- sax解析不会加载整个文档而是基于事件驱动模型的.
- 文档较小使用dom解析 文件太大使用sax解析
4.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 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);
}