JAXP在Spring中应用

    在阅读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);
		}

猜你喜欢

转载自kim-miao.iteye.com/blog/1306934