`
uule
  • 浏览: 6359276 次
  • 性别: 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 读取带有命名空间的xml文件

    以上就是使用DOM4J处理带有命名空间的XML文件的基本流程。在实际开发中,可能还需要根据具体需求处理更复杂的XML结构,如处理属性、处理命名空间的声明等。DOM4J的灵活性和强大功能使得它成为Java XML处理领域的一个...

    dom4j和xpath的jar包

    此外,DOM4J还支持命名空间、XPath表达式以及转换为其他XML格式(如SAX或DOM)的能力。 XPath是W3C制定的一种查询语言,用于在XML文档中查找信息。它可以定位到XML文档中的特定节点,如元素、属性、文本等。XPath...

    Java使用sax、dom、dom4j解析xml文档

    DOM4J不仅具有DOM的所有功能,还增加了XPath查询、XML Schema支持和StAX集成等功能。以下是一个DOM4J解析XML的简单示例: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j....

    dom4j中xpath的使用

    DOM4J是Java中一个非常流行的XML处理库,它提供了对XPath的强大支持。这篇文档将深入探讨DOM4J如何结合XPath进行操作,帮助你理解和运用这一强大的工具。 ### XPath基础 XPath的语法基于路径表达式,它允许我们...

    java解析XML dom4j dom4j-1.6.1.jar

    DOM4J是一个基于Java的XML API,它扩展了标准的DOM模型,增加了如路径导航、事件处理和XPath支持等特性。相比于标准的DOM,dom4j更加轻量级,性能更优,更适合处理大型XML文档。 2. **核心概念** - **Element**: ...

    dom4j_1.6.1.jar dom4j_2.1.0.jar

    标题提及的"dom4j_1.6.1.jar"和"dom4j_2.1.0.jar"是两个不同版本的DOM4J库的Java档案文件,DOM4J是一个非常流行的Java XML API,用于处理XML文档。这两个版本的差异在于功能、性能优化和可能存在的bug修复。描述中...

    XSD使用dom4j校验XML

    此外,DOM4J库还提供了许多其他功能,如XPath查询、XML文档的修改和创建等,这些都是处理XML数据的强大工具。 总之,DOM4J结合XSD提供了一种高效且灵活的方式来验证XML文件的结构和内容。这对于保证数据交换的准确...

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

    通过理解XPath的基本语法和使用DOM4J的API,开发者能够高效地导航XML文档,提取所需的数据,从而提高XML处理的效率和灵活性。在实际项目中,XPath不仅可以用于简单的查询,还能在XML验证、转换和数据绑定等方面发挥...

    dom4j-java-API

    - **Namespace**: DOM4J支持命名空间,方便处理具有相同标签名但位于不同命名空间的元素。 2. **DOM4J的API使用** - **解析XML**: 使用`DocumentBuilder`类可以解析XML文件并构建Document对象。 - **遍历XML**: ...

    利用dom4j--读取xml文件

    DOM4J是Java中一个非常优秀的XML处理库,它提供了丰富的API,使得操作XML文件变得简单而高效。在本文中,我们将详细探讨如何利用DOM4J库来读取XML文件。 1. **安装DOM4J** 要使用DOM4J,首先需要将其添加到你的...

    dom4j-1.6.1.jar及其2.0.2、2.1.1三个版本的jar包

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活且高效的API,使得XML的解析、创建、修改和查询变得简单。DOM4J的名字来源于Document Object Model(DOM)和Java的组合,但它并不完全遵循W3C的DOM规范...

    dom4j-2.1.0.jar

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

    dom4j解析xml文件的压缩包

    6. **Namespace支持**:DOM4J提供了对XML命名空间的全面支持,可以方便地处理包含命名空间的XML文档。 7. **DocumentType支持**:对于包含DOCTYPE声明的XML文档,DOM4J可以处理这些声明,并提供对应的DocumentType...

    dom4j学习资料_dom4j-1.6.1-API.chm

    6. **Namespace**: 处理XML命名空间,DOM4J提供了方便的方法来处理具有命名空间的XML文档。 7. **Mutation**: 支持修改XML文档,包括添加、删除、移动和替换元素、属性等。 通过这些资源,你可以系统性地学习DOM4J...

    dom4j-1.6.1.jar jaxen-1.1-beta-10.jar

    DOM4J-1.6.1.jar是Java中广泛使用的XML处理库,它提供了丰富的API来创建、读取、修改和解析XML文档。DOM4J的名字来源于Document Object Model (DOM)和Java,但它并不仅仅局限于DOM模型,还支持SAX和StAX解析器,以及...

    解析xml两个jar包dom4j-1.6.1和jaxen-1.1-beta-7.jar

    例如,你可以先使用dom4j解析XML文件并创建文档对象,然后利用jaxen提供的API执行XPath查询,获取所需的信息。这样,两者结合可以实现高效且灵活的XML处理。 总之,dom4j-1.6.1.jar和jaxen-1.1-beta-7.jar是Java中...

    dom4j-1.6.1.jar

    6. **Namespace支持**:DOM4J支持XML命名空间,这对于处理包含多个命名空间的XML文件至关重要。 7. **Document Type支持**:可以处理XML文档类型定义(DTD)和XML Schema。 8. **XPath表达式**:DOM4J提供了XPathAPI...

    dom4j_dom4j1.6.1安装包_

    DOM4J 1.6.1版的API还包括对XML Schema和DTD的支持,可以处理命名空间,提供事件驱动的处理模型,以及XML文档的序列化功能。这些特性使得DOM4J成为Java开发中处理XML的强大工具。 在实际开发中,DOM4J常用于读取...

    dom4j Api文档 dom4j-1.6.1 api文档

    DOM4J还支持其他高级特性,如命名空间处理、事件驱动的处理模型(DOM4J还提供了基于事件的`EventReader`)以及与其他XML技术(如JAXB和XSLT)的集成。此外,DOM4J的性能经过优化,对大型XML文档的处理也十分高效。 ...

    dom4j-2.1.1.jar

    总结,DOM4J-2.1.1.jar作为一款强大的XML处理工具,不仅具备了基本的XML操作能力,还提供了XPath支持、事件驱动处理等功能,使得在处理XML文档时更加便捷高效。在实际开发中,无论是简单的XML解析,还是复杂的XML...

Global site tag (gtag.js) - Google Analytics