`
xinklabi
  • 浏览: 1561089 次
  • 性别: 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文件

    NULL 博文链接:https://qiaokeli.iteye.com/blog/1790138

    xml入门教程/xml入门教程

    事例:带有子元素的元素结构定义 &lt;!ELEMENT studinfo (name,age,course+,interest*,gendar?)&gt; "?" 表示子元素只可以出现一个,也可以不出现 (0到1) "+" 表示子元素必须出现,可以出现多个 (1到多) "*" 表示...

    XML高级编程

    所以XML作为数据的这条主线包括:第6章:SAX:XML的简单API 第7章:命名空间和模式第8章:链接和查询第9章:操作XML 第10章:XML和数据库第11章:服务器到服务器第12章:电子商务第14章:WAP和WML 3. XML的可视化...

    JavaScript王者归来part.1 总数2

     13.6.4 标记行--呈现有别于其他行的背景色   13.6.5 小技巧--将代码添加到样式表   13.7 总结   第14章 级联样式表  14.1 什么是级联样式表   14.1.1 CSS样式和样式表   14.1.2 CSS的标准化   14.1.3...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    带有书签,清华大学出版社 第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 ...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    带有书签,清华大学出版社 第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 ...

    李兴华Java Web开发实战经典(高清版) Part2

    带有书签,清华大学出版社 第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 ...

    Python Cookbook

    6.7 有命名子项的元组 237 6.8 避免属性读写的冗余代码 239 6.9 快速复制对象 240 6.10 保留对被绑定方法的引用且支持垃圾回收 243 6.11 缓存环的实现 245 6.12 检查一个实例的状态变化 249 6.13 检查一个对象...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    java web 视频、电子书、源码(李兴华老师出版)

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    3.2.1、DOM解析操作 3.2.2、SAX解析操作 3.2.3、XML解析的好帮手:JDOM 3.2.4、最出色的解析工具:DOM4J 3.3、使用JavaScript操作DOM 3.4、开发实战讲解(基于Oracle数据库) 第4章 Tomcat服务器的安装及配置 ...

    《javaScrip开发技术大全》源代码

    第4章(\代码\第04章) • sample01.htm 字符串直接量 • sample02.htm 使用转义字符 • sample03.htm 数组直接量的使用方法 • sample04.htm 数组直接量 • sample05.htm ...

    PHP和MySQL WEB开发(第4版)

    8.2.4 选择有意义的键 8.2.5 考虑需要询问数据库的问题 8.2.6 避免多个空属性的设计 8.2.7 表格类型的总结 8.3 Web数据库架构 8.4 进一步学习 8.5 下一章 第9章 创建Web数据库 9.1 使用MySQL监视程序 9.2 登录到...

    PHP和MySQL Web开发第4版pdf以及源码

    8.2.4 选择有意义的键 8.2.5 考虑需要询问数据库的问题 8.2.6 避免多个空属性的设计 8.2.7 表格类型的总结 8.3 Web数据库架构 8.4 进一步学习 8.5 下一章 第9章 创建Web数据库 9.1 使用MySQL监视程序 9.2 ...

    java 面试题 总结

    28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static ...

Global site tag (gtag.js) - Google Analytics