文章目录
如何使用java自带的SAX工具类解析XML文件转换为Document对象
1. 获取需要解析的XML文件java
//根据xml路径获取该inputStream输入对象
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
InputSource inputSource = new InputSource(inputStream);
待解析的xml
文件路径如下:
待解析的xml
文件具体内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<user email="www.baidu.com">
<name>张三</name>
<age>22</age>
<sex>男</sex>
</user>
<user>
<name>李四</name>
<age>11</age>
<sex>女</sex>
</user>
<user>
<name>王五麻子</name>
<age>10</age>
<sex>不明</sex>
</user>
</users>
2. 获取DocumentBuilderFactory
-
创建
DocumentBuilderFactory
对象//创建DocumentBuilderFactory DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-
设置对象
DocumentBuilderFactory
是否需要校验xml
格式//设置是否需要验证xml documentBuilderFactory.setValidating(true);
-
设置对象
DocumentBuilderFactory
是否需要校验命名空间//设置是否需要校验xml命名空间 documentBuilderFactory.setNamespaceAware(true);
3. 获取DocumentBuilder
-
创建
DocumentBuilder
对象//创建DocumentBuilder对象 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
-
设置
DocumentBuilder
对象的entityResolver
属性,解析符合entityResolver
规定的xml
//设置entityResolver,只解析entityResolver指定的xml documentBuilder.setEntityResolver(new CustomerResolver());
自定义的
entityResolver
类的定义如下:private static class CustomerResolver implements EntityResolver { @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { System.out.println("publicId:" + publicId); System.out.println("systemId:" + systemId); if (systemId.equals("")) { System.out.println("Resolving Entity..."); return null; } else { // use the default behaviour return null; } } }
-
设置
DocumentBuilder
对象解析过程中的异常处理类//设置errhandler documentBuilder.setErrorHandler(new CustomerErrorHandler());
自定义的异常处理类定义如下:
private static class CustomerErrorHandler implements ErrorHandler { @Override public void warning(SAXParseException exception) throws SAXException { System.out.println("SAXParseException warning:"+exception); } @Override public void error(SAXParseException exception) throws SAXException { System.out.println("SAXParseException error:"+exception); } @Override public void fatalError(SAXParseException exception) throws SAXException { System.out.println("SAXParseException fatalError:"+exception); } }
4. 使用parse()
方法把XML
解析成Document
//解析x'm'l
Document document = documentBuilder.parse(inputSource);
5. 解析Document
对象中的节点信息
具体解析逻辑如下:
/**
* 解析document对象
*/
public static void parseDocument(Document document) {
Element element = document.getDocumentElement();
NodeList childNodes = element.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node nodes = childNodes.item(i);
if (nodes.getNodeType() == Node.ELEMENT_NODE) {
NamedNodeMap attributes = nodes.getAttributes();
Node node1 = attributes.getNamedItem("email");
if(node1 != null)
System.out.println(node1.getTextContent());
//循环子节点
NodeList childNodes1 = nodes.getChildNodes();
for (int j = 0; j < childNodes1.getLength(); j++) {
Node item = childNodes1.item(j);
if (item.getNodeType() == Node.ELEMENT_NODE) {
if (item.getNodeName().equals("name")) {
//xml 回车空格和文本都会算一个node
String name2 = item.getFirstChild().getNodeValue();
System.out.println(name2);
}
}
}
NodeList age = document.getElementsByTagName("age");
for (int g = 0; g < age.getLength(); g++) {
Node item = age.item(g);
String st = item.getFirstChild().getNodeValue();
System.out.println(st);
}
}
System.out.println(element.getNamespaceURI());
}
}
6.具体的代码内容
public class apptest {
public static void main(String[] args) throws Exception {
Document document = xmlReader("ceshi/a.xml");
parseDocument(document);
}
/**
* 使用DocumentBuilderFactory 输出xml的docment树机构对象
* @return
*/
public static Document xmlReader(String path) throws Exception {
//根据xml路径获取该inputStream输入对象
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
InputSource inputSource = new InputSource(inputStream);
//创建DocumentBuilderFactory
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//设置是否需要验证xml
documentBuilderFactory.setValidating(true);
//设置是否需要校验xml命名空间
documentBuilderFactory.setNamespaceAware(true);
//创建DocumentBuilder对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//设置entityResolver,只解析entityResolver指定的xml
documentBuilder.setEntityResolver(new CustomerResolver());
//设置errhandler
documentBuilder.setErrorHandler(new CustomerErrorHandler());
//解析x'm'l
Document document = documentBuilder.parse(inputSource);
return document;
}
/**
* 解析document对象
*/
public static void parseDocument(Document document) {
Element element = document.getDocumentElement();
NodeList childNodes = element.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node nodes = childNodes.item(i);
if (nodes.getNodeType() == Node.ELEMENT_NODE) {
NamedNodeMap attributes = nodes.getAttributes();
Node node1 = attributes.getNamedItem("email");
if(node1 != null)
System.out.println(node1.getTextContent());
//循环子节点
NodeList childNodes1 = nodes.getChildNodes();
for (int j = 0; j < childNodes1.getLength(); j++) {
Node item = childNodes1.item(j);
if (item.getNodeType() == Node.ELEMENT_NODE) {
if (item.getNodeName().equals("name")) {
//xml 回车空格和文本都会算一个node
String name2 = item.getFirstChild().getNodeValue();
System.out.println(name2);
}
}
}
NodeList age = document.getElementsByTagName("age");
for (int g = 0; g < age.getLength(); g++) {
Node item = age.item(g);
String st = item.getFirstChild().getNodeValue();
System.out.println(st);
}
}
System.out.println(element.getNamespaceURI());
}
}
private static class CustomerResolver implements EntityResolver {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
System.out.println("publicId:" + publicId);
System.out.println("systemId:" + systemId);
if (systemId.equals("")) {
System.out.println("Resolving Entity...");
return null;
} else {
// use the default behaviour
return null;
}
}
}
private static class CustomerErrorHandler implements ErrorHandler {
@Override
public void warning(SAXParseException exception) throws SAXException {
System.out.println("SAXParseException warning:"+exception);
}
@Override
public void error(SAXParseException exception) throws SAXException {
System.out.println("SAXParseException error:"+exception);
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
System.out.println("SAXParseException fatalError:"+exception);
}
}
}
7.解析结果展示
其中上面两条信息自定义异常处理类检测到信息打印,下面的输出都是对应xml中的各个节点信息。