`
uule
  • 浏览: 6305018 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

dom4j处理带命名空间的XML-使用XPath

    博客分类:
  • XML
 
阅读更多

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

w3school XPath教程

Dom4J学习笔记

 

例子1:

<report  xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.15" id="1">
    <list-property name="cssStyleSheets">
        <structure>
            <property name="fileName">D: eport.css</property>
        </structure>
    </list-property>
</report>

 

第一个方案.设置你的xpath的命名空间setNamespaceURIs

    XPath x = document.createXPath("//design:list-property");

    x.setNamespaceURIs(map);

    x.selectNodes(document);

 

public class TransferXML {
    public static void main(String[] args) throws Exception{        
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        Document document = saxReader.read(file);

        Map map = new HashMap();
        map.put("design","http://www.eclipse.org/birt/2005/design");
        XPath x = document.createXPath("//design:list-property");
        x.setNamespaceURIs(map);
        List nodelist = x.selectNodes(document);
        System.out.println(nodelist.size());
    }
}

 

 第二个解决方案:设置你的DocumentFactory()的命名空间 setXPathNamespaceURIs

    saxReader.getDocumentFactory().setXPathNamespaceURIs(map);

    Document document = saxReader.read(file);

    document.selectNodes("//design:list-property");

 

public class TransferXML {
    public static void main(String[] args) throws Exception{
        Map map = new HashMap();
        map.put("design","http://www.eclipse.org/birt/2005/design");
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
        Document document = saxReader.read(file);
        List tmp = document.selectNodes("//design:list-property");
        System.out.println(tmp.size());
    }
}

 

第三种方法:就是不使用开发环境给你提供的一系列对象,而是用XPath语法中自带的local-name() 和 namespace-uri() 指定你要使用的节点名和命名空间

当你遇到使用xslt来样式化xml时,就知道这个笨方法的好处了:

    Document document =  saxReader.read(file);

    List tmp = document.selectNodes("//*[local-name()='report' and namespace-uri()='http://www.eclipse.org/birt/2005/design']/* [local-name()='list-property']");

 

public class TransferXML {
    public static void main(String[] args) throws Exception
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        Document document = saxReader.read(file);
        List tmp = document.selectNodes("//*[local-name()='report' and namespace-uri()='http://www.eclipse.org/birt/2005/design']/* [local-name()='list-property']");
        System.out.println(tmp.size());
    }
}

 

例子2:

 

<?xml version="1.0" encoding="UTF-8"?>  
  
<addresses  xmlns="http://www.example.org/cameraServerAddress" >  
      
    <address>  
        <db>r1app.nvts.co</db>  
        <zh>美国东1</zh>  
        <en>US-East1</en>  
    </address>  
    <address>      
        <db>r2app.nvts.co</db>  
        <zh>日本1</zh>      
        <en>JP-1</en>  
    </address>  
      
    <address>  
        <db>r3app.nvts.co</db>  
        <zh>欧洲1</zh>  
        <en>EU-1</en>  
    </address>        
</addresses>  

 

/** 
     * 初始化CameraServerAddress,从xml配置文件初始化 
     */  
    @SuppressWarnings("unchecked")  
    public void initCameraServerAddresses(){  
        try {  
            Map<String,String> uris = new HashMap<String, String>();  
            uris.put("cameraServerAddress"  , "http://www.example.org/cameraServerAddress");  
            SAXReader reader = new SAXReader();   
            Document root = reader.read(this.getClass().getClassLoader().getResourceAsStream("cameraServerAddresses.xml"));  
            XPath xpath = root.createXPath("//cameraServerAddress:address");    //创建XPath  
            xpath.setNamespaceURIs(uris);   //加入NameSpace  
            List<DefaultElement> nodes = xpath.selectNodes(root); //执行搜索  
            for (DefaultElement de : nodes) {  
                   de.add(new Namespace("cameraServerAddress", "http://www.example.org/cameraServerAddress"));  //这里也要再次加入NameSpace  
                   Node db = de.selectSingleNode("cameraServerAddress:db");  
                   Node zh =  de.selectSingleNode("cameraServerAddress:zh");  
                   Node en = de.selectSingleNode("cameraServerAddress:en");  
                   NVContext.cameraServerAddresses.add(new CameraServerAddress(  
                           db.getText(), zh.getText(), en.getText()));    
            }  
              
        } catch (Exception e) {  
            log.error("初始化CameraServerAddress失败");    
            e.printStackTrace();  
        }  
          
    }  

 

例子3(自己例子):

<?xml version="1.0" encoding="UTF-8"?>

<webservices xmlns="http://ws.test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="webservices.xsd">  
  <webservice wsname="ws1" wsversion=""> 
    <wsdlurl>http://localhost:8888/ws1?wsdl</wsdlurl> 
  </webservice>  
  <webservice wsname="ws2"> 
    <wsdlurl>http://localhost:8888/ws2?wsdl</wsdlurl> 
  </webservice>  
  <webservice wsname="ws3" wsversion="v1"> 
    <wsdlurl>http://localhost:8888/ws3?wsdl</wsdlurl> 
  </webservice>  
  <webservice wsname="srv4"> 
    <wsdlurl>http://localhost:8889/ws4?wsdl</wsdlurl> 
  </webservice>  
  <webservice wsname="ESB_YS_YS_InquiryMachineInfoSrv">
    <wsdlurl>http://10.204.104.87:8888/ESB_YS_YS_InquiryMachineInfoSrv/ESBYSYSInquiryMachineInfoSrv?wsdl</wsdlurl>
  </webservice>
</webservices>

  

/**
	 * 添加或更新单个webservice子节点
	 * @param wi 封装的服务信息
	 */
	public synchronized void addOrUpdate(WebserviceNode wi) {
		if(doc != null){
			Element root = doc.getRootElement();
			
			addOrUpdateWebservice(wi, root);
			
			save();
		}
	}

 

 

/**
	 * 在指定的节点上添加webservice子节点
	 * 
	 * @param wi 封装的服务信息
	 * @param root root节点
	 */
	private void addOrUpdateWebservice(WebserviceNode wi, Element root) {
		removeWebservices(wi, root);
		
		addOrUpdateWebserviceElement(wi, root);
		
		wis.add(wi);
	}

 

private void removeWebservices(WebserviceNode wi, Element root) {
		List<Element> es = findWebserviceElements(wi, root);
		
		if(es.size() > 0){
			// 删除doc中的元素
			for(Element e : es){
				root.remove(e);
			}
			// 删除集合中的元素
			Iterator<WebserviceNode> wiIterator = wis.iterator();
			while(wiIterator.hasNext()){  
				WebserviceNode i = wiIterator.next();  
				if(i.equals(wi)){
					wiIterator.remove();
				}
			}  
		}
	}

 

查找满足条件的子节点:

/**
	 * 查找匹配的webservice元素
	 * 
	 * @param wi
	 * @param root
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private List<Element> findWebserviceElements(WebserviceNode wi, Element root) {
		Map<String, String> ns = new HashMap<String, String>();
		ns.put("vis", "http://ws.test.com");
		
		String xpath = "/vis:webservices/vis:webservice[@wsname='"+ wi.getWsName() + "'" + (wi.hasVersionInfo() ? " and @wsversion='" + wi.getWsVersion() + "'" : " and (not(@wsversion) or normalize-space(@wsversion)='')") + "]";
		XPath x = root.createXPath(xpath);
		x.setNamespaceURIs(ns);
		
		//System.out.println(xpath);
		
		List<Element> es = x.selectNodes(root);
		return es;
	}

 

/**
	 * 在指定的节点上添加webservice子节点(xml document)
	 * 
	 * @param wi
	 * @param root
	 */
	private void addOrUpdateWebserviceElement(WebserviceNode wi, Element root) {
		Element ws = root.addElement("webservice");
		ws.addAttribute("wsname", wi.getWsName());
		if(wi.hasVersionInfo()){
			ws.addAttribute("wsversion", wi.getWsVersion());
		}
		ws.addElement("wsdlurl").setText(wi.getWsdlUrl());
	}

 保存XML文件:

/**
	 * 保存至硬盘
	 */
	private void save() {
		// 将document保存至硬盘
		OutputFormat format = OutputFormat.createPrettyPrint();
		try {
			XMLWriter writer = new XMLWriter(new FileWriter(PATH), format);
			writer.write(doc);
			writer.close();
		} catch (IOException e) {
			System.err.println("Persist '" + PATH + "' is Failed...");
			e.printStackTrace();
		}
	}

 。。

 

分享到:
评论

相关推荐

    DOM4J从基础到精通

    二、使用dom4j创建xml文档 3 三、使用dom4j解析xml文件 5 1. 构建dom4j树 5 2. 获取节点 5 3. 获取属性 6 4. 使用XPath获取节点和属性 6 四、使用dom4j修改xml文件 7 五、常用方法 8 1.Element元素API 8 2. ...

    JsoupXpath-0.3.2.jar 完整版

    JsoupXpath 是一款纯Java开发的使用xpath解析提取html数据的解析器,针对html解析完整实现了W3C XPATH 1.0标准语法,xpath的Lexer和Parser基于Antlr4构建,html的DOM树生成采用Jsoup,故命名为JsoupXpath....

    java 的dom的读取xml

    • XML / XML 命名空间 如果您希望首先学习这些项目,请在我们的 首页 访问这些教程。 什么是 XPath? • XPath 使用路径表达式在 XML 文档中进行导航 • XPath 包含一个标准函数库 • XPath 是 XSLT 中的主要元素...

    xml入门经典-part3(中文版)

    目 录 译者序 作者简介 前言 第1章 XML简介 1.1 标记语言 1.2 XML的起源和目的 1.3 Web体系结构:过去与未来 1.3.1 传统Web体系结构 1.3.2 XML下的Web体系结构 ...9.5 使用DOM进行XML文档的转换

    XML高级编程pdf

    7.4 在格式正规的书籍里使用命名空间 实例 7.5 模式 7.5.1 与DTD有关的问题 7.5.2 一个对创建模式的帮助 7.6 W3C在XML 模式方面的工作 7.6.1 DTD与XML 模式的比较 7.6.2 结构 7.6.3 数据类型 7.7 简化了的...

    XML 高级编程(高清版)

    7.4 在格式正规的书籍里使用命名空间 实例 7.5 模式 7.5.1 与DTD有关的问题 7.5.2 一个对创建模式的帮助 7.6 W3C在XML 模式方面的工作 7.6.1 DTD与XML 模式的比较 7.6.2 结构 7.6.3 数据类型 7.7 简化了的...

    XML高级编程 (Extensible Markup Language)

    7.4 在格式正规的书籍里使用命名空间 实例 7.5 模式 7.5.1 与DTD有关的问题 7.5.2 一个对创建模式的帮助 7.6 W3C在XML 模式方面的工作 7.6.1 DTD与XML 模式的比较 7.6.2 结构 7.6.3 数据类型 7.7 简化了的...

    XML及其编程与应用

    05命名空间 06表现与转换1-CSS 06表现与转换2-XSLT 06表现与转换3-XSL-FO 07定位、链接与查询1-XPath 07定位、链接与查询2-链接 07定位、链接与查询3-XQuery 08编程接口1-概述与DOM 08编程接口2-SAX 08编程...

    Java and XML, 3rd Edition

    《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM、StAX、JDOM以及dom4j的应用程序编程接口,同时还囊括了最新版本的用于XML处理的Java应用程序编程接口(JAXP)和用于XML绑定...

    day023-xml解析笔记和代码.rar

    由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便, 结合XPATH就可以直接获取到某个元素 使用dom4j支持xpath的操作的几种主要形式 第一种形式 /a/b/c: 表示一层...

    JAVA与XML.rar

    《Java与XML》(第三版)的内容涵盖了所有主要的Java XML处理库程序,全面讲解了SAX、DOM、StAX、JDOM以及dom4j的应用程序编程接口,同时还囊括了最新版本的用于XML处理的Java应用程序编程接口(JAXP)和用于XML绑定...

    XML高级编程

    8.6.4 使用Xpath和XSLT查询XML文档 298 8.6.5 查询语言展望 309 8.7 小结 309 第9章 转换 XML 310 9.1 为什么转换 XML 311 9.1.1 在不同词汇表之间转换 311 9.1.2 动态转换 312 9.1.3 不同的浏览器 312 9.2 XSL 313 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 587 第20章 filter在web开发中的应用 588 20.1 过滤器概述 588 20.2 filter api 589 20.2.1 filter接口 589 20.2.2 filterconfig接口 590 20.2.3 ...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。...

    C# XML入门经典

    主要内容包括:XML语法和格式良好的XML,XML命名空间,利用DTD和XML Schema进行XML验证,使用SOAP和Web服务,以及运用ADO.NET进行数据库访问等。本书还用两个案例分析来展示XML的具体应用。  本书适合于有一定的...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 587 第20章 filter在web开发中的应用 588 20.1 过滤器概述 588 20.2 filter api 589 20.2.1 filter接口 589 20.2.2 filterconfig接口 590 20.2.3 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 587 第20章 filter在web开发中的应用 588 20.1 过滤器概述 588 20.2 filter api 589 20.2.1 filter接口 589 20.2.2 filterconfig接口 590 20.2.3 ...

    C#XML入门经典 C#编程人员必备的XML技能.part2

    在.NET中使用XML &lt;br&gt;3.1 XML如何适合.NET 3.1.1 XML 3.1.2 文档对象模型(DOM) 3.1.3 命名空间 3.1.4 DTD和XML Schema 3.1.5 XPath 3.1.6 XSLT 3.2 .NET Framework使用XML 3.2.1 配置...

    Java与XML第三版本

    书中的主题为XML基础,包括DTD、命名空间(namespace)、XML Schema和数据格式转换(Transformation) SAX应用程序编程接口,包括处理器接口、过滤器接口和写出接口 DOM应用程序编程接口,包括DOM第2层、第3层和DOM ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 587 第20章 filter在web开发中的应用 588 20.1 过滤器概述 588 20.2 filter api 589 20.2.1 filter接口 589 20.2.2 filterconfig接口 590 20.2.3 ...

Global site tag (gtag.js) - Google Analytics