dom4j处理带命名空间的XML-使用XPath(转)
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
例子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-使用XPath(转)的更多相关文章
- dom4j解析带命名空间的xml文件
文件内容如下 <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=& ...
- 带命名空间的XML的dom4j应用<转>
Element root = document.getRootElement(); List recordenvlist = document.selectNodes("//gm ...
- C#读取带命名空间的xml,xaml文件的解决方案
使用C#读取xml文件有三种常用的方式: 1.xmlDocument 2.XmlTextReader 3.Linq To Xml 但是这些方式在读写有些带命名空间的xml时就不知道怎么办了(例如把xa ...
- 由“Jasperrpeorts 4.1.2升级到5.1.2对flex项目的解析”到AS3 带命名空间的XML的操作
原文同步至:http://www.waylau.com/from-jasperrpeorts-4-1-2-upgraded-to-5-1-2-parsing-of-flex-projects-to-t ...
- C#读取带命名空间的xml
首先带有命名空间的xml读取可以使用Xml.Linq,也可以使用xpath,本文将采用xpath的方式解析. 原文参考了:https://www.cnblogs.com/duanjt/p/544054 ...
- Linq to xml 操作带命名空间的xml
昨天需要操作用代码操作csproj文件,实现不同vs版本的切换. 在用XElement读取了csproj文件以后怎么也获取不到想要的对象. 反反复复试验了好多次都不得要领:先看下csproj文件的内容 ...
- XML记一次带命名空间的xml读取
public static void ReadXML(string xmlUrl) { //判断文件是否存在 if (!File.Exists(xmlUrl)) { Console.WriteLine ...
- linq检索带命名空间的xml
XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...
- Linq to Xml读取复杂xml(带命名空间)
前言:xml的操作方式有多种,但要论使用频繁程度,博主用得最多的还是Linq to xml的方式,觉得它使用起来很方便,就用那么几个方法就能完成简单xml的读写.之前做的一个项目有一个很变态的需求:C ...
随机推荐
- SVN Cannot merge into a working copy that has local modifications
我尝试了 主支,分支都提交,但是依然无法合并. 最终,我在服务器上将分支删除,然后主支在拷贝过去. 一,打开服务器资源 二,删除分支 三,拷贝主支到分支 四,刷新分支,就能看到了. 然后在分支项目中, ...
- 【转】40个Java多线程问题总结
文章转自 五月的仓颉 http://www.cnblogs.com/xrq730/p/5060921.html 前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习, ...
- The linux command 之进程
******************查看进程********************* 一.使用ps命令 [me@linuxbox ~]$ ps PID TTY TIME CMD pts/ :: ba ...
- ctx.beginPath()开始新路径
beginPath() 方法开始一条路径,或重置当前的路径. 提示:请使用这些方法来创建路径 moveTo().lineTo().quadricCurveTo().bezierCurveTo().ar ...
- django笔记(python web框架)
1.Python 下载地址:https://www.python.org/downloads/ 2.Django 下载地址:https://www.djangoproject.com/download ...
- (转载)js引擎的执行过程(一)
概述 js是一种非常灵活的语言,理解js引擎的执行过程对我们学习javascript非常重要,但是网上讲解js引擎的文章也大多是浅尝辄止或者只局部分析,例如只分析事件循环(Event Loop)或者变 ...
- jmeter+ant+jenkins 搭建接口自动化测试环境
过程参考:http://www.cnblogs.com/lxs1314/p/7487066.html 1. 安装ant 2. 安装jenkins 遇到问题: 启动Tomcat后,访问http://lo ...
- 二分查找总结及部分Lintcode题目分析 1
进行二分查找课程回顾与总结,包括以下几个方面,二分法的模板总结和解题思路.应用. 二分法模板总结classical binary search: 1. 必须要做的排除极端情况,也就是数组(用A表示)不 ...
- SpringBoot--外部配置
常见的SpringBoot外部配置有常规属性配置.类型安全的配置.日志配置.Profile配置 一.常规属性配置 在spring中,注入properties中的配置值时,需要两步: 通过注解@Prop ...
- 如何使用Python-GnuPG和Python3 实现数据的解密和加密
介绍 GnuPG包提供用于生成和存储加密密钥的完整解决方案.它还允许您加密和签名数据和通信. 在本教程中,您将创建一系列使用Python 3和python-gnupg模块的脚本.这些脚本允许您对多个文 ...