`
xinklabi
  • 浏览: 1586544 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

dom4j解析带有命名空间的xml

 
阅读更多
  1. Element rootEle = resultDoc.getRootElement();  
  2. String nsUri = rootEle.getNamespaceURI();  
  3. Map nsMap = new HashMap();  
  4. nsMap.put("aop", "http://www.springframework.org/schema/aop");
  5. nsMap.put("tx", "http://www.springframework.org/schema/tx");   
  6. XPath mesXpath = resultDoc.createXPath("//aop:bean/tx:bean");  
  7. mesXpath.setNamespaceURIs(nsMap);  
  8. List<Node> mesList = mesXpath.selectNodes(resultDoc); 
  9. 如果要找一中xml的txbean,要用上面代码的方式

1.XML的命名空间:

许多XML配置文件中,通常在开头部分带有命名空间,如spring中:

 

[html] view plaincopy
 
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.        xmlns:aop="http://www.springframework.org/schema/aop"  
  4.        xmlns:tx="http://www.springframework.org/schema/tx"  
  5.        xsi:schemaLocation="  
  6.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  7.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  8.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"  
  9.        default-lazy-init="true">  
  10.   <aop:bean name="aopnode">
  11.       <tx:bean name="txnode"/>
  12.   </aop:bean>
  13. </beans>  

在spring中,解析节点使用lazy loading方式:即先获取root节点,然后依次获取其子节点解析。在处理每个bean的命名空间时,会取其namespace与字符串“http://www.springframework.org/schema/beans”比较,以判断是否为对应spring的bean节点。一般其它情况并不存在需要对namespace进行处理

见:org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.isDefaultNamespace()

 

2.若要使用dom4j处理带namespace的xml文件,通过遍历根节点方式不影响命名空间。

而若通过普通的xpath方式查询,则必须对xpath进行预处理:

首先,将namespace放入map,设置到DocumentFactory

 

[java] view plaincopy
 
  1. SAXReader reader1 = new SAXReader();  
  2.   
  3. Map<String, String>map=new HashMap<String, String>();  
  4. map.put("abc","http://www.springframework.org/schema/beans");  
  5.   
  6. reader1.getDocumentFactory().setXPathNamespaceURIs(map);  


然后,当通过xpath查询节点或attribute时,需要将所有的节点属性前加上先前设置的map键值(attribute名不需要加)

 

eg,查询xpath: beans/bean[@id='root']

 

[java] view plaincopy
 
  1. Element root=(Element) document.selectSingleNode("abc:beans/abc:bean[@id='root']");  

或者: //bean[@id='root']

 

 

[java] view plaincopy
 
  1. Element root=(Element) document.selectSingleNode("//abc:bean[@id='root']");  


当然,可以使用正则表达式对原xpath进行转换

 

 

[java] view plaincopy
 
  1. public static String getXMLNameSpaceFixed(String xpath)  
  2. {  
  3.     xpath= xpath.replaceAll("/(\\w)""/"+"abc:$1");//replace start with "/"  
  4.     xpath= xpath.replaceAll("^(\\w)""abc:$1");    //replace start with word  
  5.     return xpath;  
  6. }  


3.当处理另一个文档,此时若只是SAXReader reader2 = new SAXReader(),会发现仍然沿用原先的map;

 

而且重新设置新的namespace的map后,原有的reader1的xpath查询失效。

原因是,dom4j中默认的SAXReader初始化时调用DocumentFactory的单例对象,

因此必须使用新的工厂避免对原有工厂的影响:

 

[java] view plaincopy
 
  1. SAXReader reader2 = new SAXReader(new DocumentFactory());  
  2.   
  3. Map<String, String>map=new HashMap<String, String>();  
  4. map.put("xyz","http://www.springframework.org/schema/beans");  
  5.   
  6. reader2.getDocumentFactory().setXPathNamespaceURIs(map);  
分享到:
评论

相关推荐

    dom4j 读取带有命名空间的xml文件

    在处理带有命名空间的XML文件时,DOM4J库显得尤为重要,因为XML命名空间是XML规范中一个关键的概念,用于避免元素名称的冲突。 XML命名空间的引入是为了在一个文档中使用来自不同来源的元素和属性。它们通过URI...

    xml内容解析,包含命名空间时需特殊处理(dom4j)

    在处理带有命名空间的XML时,DOM4J提供了一套完整的解决方案。 首先,我们需要理解XML命名空间的基本概念。命名空间通过使用一个URI(Uniform Resource Identifier)来唯一标识一组元素和属性。它们通常以`xmlns:`...

    Java用DOM4J读取XML

    DOM4J不仅兼容DOM和SAX,还提供了额外的功能,如自动命名空间处理、文档验证等。 DOM4J的一些特点包括: - **轻量级**:DOM4J相比标准的DOM实现更加轻量,消耗更少的内存。 - **易用性**:DOM4J提供了一套直观且...

    Dom4j解析XML(例子)+Dom4j 使用简介

    - **命名空间支持**:处理带有命名空间的XML文档。 - **XPath支持**:利用XPath快速定位XML节点。 - **事件驱动解析**:结合SAX或StAX,实现低内存占用的XML解析。 在实际开发中,Dom4j的灵活性和易用性使其成为...

    dom4j-1.6.1-解析xml架包.zip

    4. **Namespace**: 处理命名空间,使处理带有前缀的XML元素变得简单。 5. **XPath**: 支持XPath表达式,允许我们通过简洁的字符串来查找和操作XML文档的任何部分。 6. **Document**: 整个XML文档的根对象,包含了...

    dom4j的jar包,用于解析XML文件

    5. **命名空间(Namespace)支持**:对于包含命名空间的XML文档,DOM4J提供了很好的支持,可以方便地处理带有命名空间的元素和属性。 6. **事件处理**:虽然DOM4J主要基于DOM模型,但同时也支持SAX事件驱动的解析,...

    dom4j所需要的所有jar包

    7. **命名空间(Namespace)支持**:XML文档经常包含命名空间,DOM4J提供了对这些命名空间的处理,包括注册、查找和操作带有命名空间的元素。 8. **序列化与反序列化**:DOM4J不仅可以将XML文档解析为内存中的对象...

    dom4j学习资料

    6. **命名空间支持**:DOM4J全面支持XML命名空间,使得处理带有命名空间的XML文档变得简单。 7. **事件处理**:DOM4J的EventSupport接口允许开发者实现自定义的事件监听器,以便在解析或修改XML时执行特定操作。 8...

    dom4j-1.6.1.zip

    比如,Element对象对应XML的元素节点,Attribute对象表示元素的属性,Namespace对象则管理命名空间,使得处理带有命名空间的XML文档变得简单。 在实际开发中,DOM4J不仅可以用于解析XML,还可以用于生成XML文档。...

    dom4j_jar包

    7. **命名空间支持**: DOM4J 具有完整的命名空间处理机制,能够处理带有命名空间的XML文档。 **DOM4J的应用场景** DOM4J 在各种Java应用中都有广泛的应用,包括但不限于: - Web服务:在构建和消费Web服务时,DOM...

    dom4j-2.1.1 jar和source.jar

    7. **命名空间支持**:DOM4J对XML命名空间提供了良好的支持,方便处理带有命名空间的XML文档。 在实际开发中,DOM4J常被用于Java Web应用、数据交换、配置文件处理等领域。比如,在Spring框架中,DOM4J就用于解析和...

    Demo4j和XPath解析XML的文件路径表达式(ZVON.org - X 路径教程)

    DOM4J提供了注册命名空间的方法,以正确解析带有前缀的XPath表达式。 总结来说,Demo4j虽然不直接支持XPath,但通过结合DOM4J这样的XML库,我们可以方便地在Java应用程序中利用XPath的强大功能。通过理解XPath的...

    xml.rar_dom4j xml

    - **支持命名空间**:DOM4J处理XML命名空间的能力强,可以方便地处理带有命名空间的XML文档。 - **与Spring框架的集成**:Spring框架广泛使用DOM4J进行XML配置文件的解析,使其在企业级应用中得到广泛应用。 3. *...

    dom4jxml资源

    5. **Namespace(命名空间)**:处理带有命名空间的XML文档时,DOM4J提供了对命名空间的支持。 三、主要功能 1. **解析XML**:DOM4J可以使用SAX或DOM解析器读取XML文件,生成相应的Document对象。 2. **创建XML**:...

    xml解析dom4.zip

    DOM4J支持处理命名空间,通过`Namespace`类和`QName`类,可以方便地与带有命名空间的XML元素交互。 除了DOM4J,压缩包中还包含了一个`jaxen-1.1-beta-6.jar`文件,这是Jaxen库的早期版本。Jaxen提供了一个统一的API...

    dom4j教程 java

    6. **属性和命名空间**:DOM4J对XML属性和命名空间有很好的支持,可以方便地处理带有属性和命名空间的XML元素。 在《JAVA高手解析XML配置文件的读取操作.doc》中,可能会深入讲解如何利用DOM4J读取和操作XML配置...

    dom4j-2.1.0.jar

    - **Namespace支持**:DOM4J对XML命名空间有良好的支持,处理带命名空间的XML文档更加便捷。 4. **DOM4J的使用示例** - 解析XML文档: ```java File file = new File("example.xml"); Document document = ...

    dom4j从基础到精通.docx

    - **命名空间(Namespace)操作**:处理 XML 中的命名空间,确保正确解析和创建带命名空间的元素。 【Qname 介绍】 QName( Qualified Name)是 XML 中的限定名称,包含一个前缀和一个本地名称,用于标识命名空间...

    dom4j1.6.1

    4. **命名空间支持**:DOM4J对XML命名空间提供了良好的支持,可以方便地处理带有命名空间的XML文档,避免了命名冲突的问题。 5. **XPath支持**:DOM4J集成XPath(XML Path Language),这是一门强大的查询语言,...

    dom4J完整版jar下载

    5. **命名空间支持**:对于包含命名空间的XML文档,DOM4J提供了很好的处理机制,使得处理带有命名空间的XML变得简单。 6. **事件处理**:DOM4J允许注册事件监听器,可以监听和处理XML解析过程中的事件,如开始元素...

Global site tag (gtag.js) - Google Analytics