在阅读spring源码的过程中,想看下spring对xml的解析,发现是用的jaxp相关API实现的.于是想写个小demo,以加深对代码的理解.
1.用JAXP解析XML文档
Java有多种方法可以分析XML文档,你可以选择现在已经成熟的标准技术,比如DOM和SAX,或者你可以选择专用于处理XML的Java API (Java API for XML Processing,JAXP)。JAXP是一种专门提供XML文档解析的Java接口,下面简单介绍下.
2.用JAXP解析XML的步骤
(1)得到DocumentBuilderFactory解析器的工厂实例
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
(2)从DocumentBuilder中工厂获得 DOM 解析器
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
(3)解析 XML 文档的输入流,得到一个 Document
Document doc=dombuilder.parse(is);
(4)得到 XML 文档的根节点
Element root=doc.getDocumentElement();
(5)得到节点的子节点
NodeList beans=root.getChildNodes();
3.一个简单的Demo
demo.xml的内容如下:
<?xml version="1.0" ?> <beans> <bean id="beanId"> <property>spring</property> </bean> </beans>
public class JAXPDemo {
public static void main(String[] args) {
String filename = "E:/demo/demo.xml";
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
Document document = documentBuilder.parse(filename);
Element root = document.getDocumentElement();
NodeList beans = root.getChildNodes();
for (int i = 0; i < beans.getLength(); i++) {
Node bean = beans.item(i);
if (bean.getNodeType() == Node.ELEMENT_NODE) {
//取得节点的属性值
String beanId = bean.getAttributes().getNamedItem("id").getNodeValue();
System.out.println(beanId);
for (Node node = bean.getFirstChild(); node != null; node = node
.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
if (node.getNodeName().equals("property")) {
String name = node.getNodeName();
String nodeValue = node.getFirstChild().getNodeValue();
System.out.println(name);
System.out.println(nodeValue);
}
}
}
}
}
} catch (Exception e) {
}
}
}
4.Spring中对xml文件的解析
Spring对xml文件的解析也是使用了JAXP,在其实现类中DefaultDocumentLoader可以看到.
public Document loadDocument(InputSource inputSource, EntityResolver entityResolver,
ErrorHandler errorHandler, int validationMode, boolean namespaceAware) throws Exception {
DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware);
if (logger.isDebugEnabled()) {
logger.debug("Using JAXP provider [" + factory.getClass().getName() + "]");
}
DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler);
return builder.parse(inputSource);
}