JAXP在Spring中应用

在阅读spring源码的过程中,想看下spring对xml的解析,发现是用的jaxp相关API实现的.于是想写个小demo,以加深对代码的理解.

[size=large][b]1.用JAXP解析XML文档[/b][/size]

Java有多种方法可以分析XML文档,你可以选择现在已经成熟的标准技术,比如DOM和SAX,或者你可以选择专用于处理XML的
Java API (Java API for XML Processing,JAXP)。JAXP是一种专门提供XML文档解析的Java接口,下面简单介绍下.

[b][size=large]2.用JAXP解析XML的步骤[/size][/b]

(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(); 



[b][size=large]3.一个简单的Demo[/size][/b]
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) {

}
}
}


[b][size=large]4.Spring中对xml文件的解析[/size][/b]

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值