JDOM使用XPath查找带NameSpace的节点

对于XML文件中不带命名空间(NameSpace) 的节点,如

<blog_Content>

用 JDOM 的 XPath 来搜索这个节点时可用下面之中任一代码:

① List<Element> elements = XPath.selectNodes(document,"//blog_Content");

② XPath xpath = XPath.newInstance("//blog_Content");
  List<Element> elements = xpath.selectNodes(document);

但是如果是查找带命名空间的节点,如

<blogns:blog_Content xmlns:blogns="x-schema:#Schema2">

<blogns:Title>Quartz Job Scheduling Framework[翻译]第一章. 企业应用中的作业调度</blogns:Title>

..............................................

还是用前面那两种方法可就查不到 blog_Content 节点了,即使是写成

List<Element> elements = XPath.selectNodes(document,"//blogns:blog_Content");

或者对于 <blogns:Title> 写成

List<Element> elements = XPath.selectNodes(document,"//blogns:Title");

都是检索不到元素的,elements.size() 为 0。

这时候,我们需要明确的指定你的 XPath 实例所要用的 NameSpace,用 XPath 的 addNamespace() 方法,操作代码如下:

XPath xpath = XPath.newInstance("//blogns:blog_Content");
   xpath.addNamespace("blogns","x-schema:#Schema2");
   List<Element> elements = xpath.selectNodes(document);

这样就能检索到 <blogns:blog_Content> 节点了,对于 <blogns:Title> 也是一样的做法。

可是对于使用默认命名空间(Default Namespace) 的节点又该如何检索呢?例如检索下面XML的 <blog_Content> 节点

<blog_Content xmlns="x-schema:#Schema2">

<Title>Quartz Job Scheduling Framework[翻译]第一章. 企业应用中的作业调度</Title>

.................................

以一个较为常规的思维方式吧,Default Namespace 大概就是 "" 空字符串吧,那么是不是写成

XPath xpath = XPath.newInstance("//blog_Content");
   xpath.addNamespace("","x-schema:#Schema2");
   List<Element> elements = xpath.selectNodes(document);

就能找到节点了呢?很遗憾,这里的 elements.size() 等于 0,检索失败。

JDOM 要求,不知是否是所有XML解析 API 都有这样的规范,即使使用的是默认命名空间,在用 XPath 检索时也必须给这个默认命名空间指定一个名字,我们这里就选 "default" 吧,你可以任意指定一个不冲突的名字,不要被这里的 "default" 误导了只能用它。所以检索 <blog_Content> 的代码就是:

XPath xpath = XPath.newInstance("//default:blog_Content");
xpath.addNamespace("default","x-schema:#Schema2");
List<Element> elements = xpath.selectNodes(document);

时间: 2024-10-28 02:53:02

JDOM使用XPath查找带NameSpace的节点的相关文章

递归-如何查找无向图两个节点间的所有路径

问题描述 如何查找无向图两个节点间的所有路径 看到有用深度优先遍历+递归的方法实现的,但当图比较大时递归效率很低,还能有什么方法可以快一点的,最好能有java程序实现参考 解决方案 所有路径没得优化,都得遍历.如果是找出一条路径,这个有优化的可能.

xStream如果处理有带namespace前缀的xml

问题描述 xStream如果处理有带namespace前缀的xml,如:<h:tablexmlns:h="http://www.w3.org/TR/html4/"><h:tr><h:td>Apples</h:td><h:td>Bananas</h:td></h:tr></h:table> 解决方案 解决方案二:用xstream的StaxDriver配置.

jaxb如果处理有带namespace前缀的xml,如:

问题描述 jaxb如果处理有带namespace前缀的xml,如:<h:tablexmlns:h="http://www.w3.org/TR/html4/"><h:tr><h:td>Apples</h:td><h:td>Bananas</h:td></h:tr></h:table> 解决方案

MySql LIKE查找带反斜线“\”的记录

使用 \\ 还是 \ 看你如何的定义字符串的.其实只有两处转义:PHP 中 和 MySQL 中. PHP 中 如果你用双引号"" 定义字符串, 那么这里有一次转义.如果用单引号就不会转义. $sql = "SELECT * FROM table WHERE col LIKE '%a\\%' "; 这样实际上经过转义发给 MySQL 的是 SELECT * FROM table WHERE col LIKE '%a\%'; 用单引号则不会转义(除了单引号,当然变量也不

xpath的数据和节点类型以及XPath中节点匹配的基本方法

XPath数据类型 XPath可分为四种数据类型: 节点集(node-set) 节点集是通过路径匹配返回的符合条件的一组节点的集合.其它类型的数据不能转换为节点集. 布尔值(boolean) 由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和 false两个值.布尔值可以和数值类型.字符串类型相互转换. 字符串(string) 字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数.字符串可与数值类型.布尔值类型的数据相互转换. 数值(number) 在XPa

使用DOM4j解析XML文件,由于xmls和scheme存在无法正常利用Xpath方法取到节点

问题描述 经过测试,发现问题出在下面两个xml语句上.<CNML xmlns="http://www.cnml.org.cn/2005/CNMLSchema"><NameTopic scheme="urn:cnml:xinhua.org:20070701:topiclist.cnml-Organization-1:1" topicRef="Xinhua">xmlns和scheme是特殊的属性吗,如果把这两个属性去掉就可以正

javascrpt DOMDocument查找xml指定节点实现程序

 代码如下 复制代码 <?php  $domxml = new DOMDocument();  $domxml->load("test.xml");  //使用xpath技术,xpath是需要结合dom技术来使用的,主要是用于查询,把一些用dom很难实现的节点查询技术做出来,例如不分层级的节点查询  //格式具体参考手册,下面给出了基本的参考流程,查找所有的BBB节点  $xpath = new DOMXPath($domxml);  $node_list = $xpath

JS 使用for循环遍历子节点查找元素_javascript技巧

这篇文章主要介绍了JS 使用for循环配合数组遍历子节点查找元素 function nextChildNode(node,clazz,tagName){ var count= node.childElementCount; for(var i=0;i<count;i++){ if(node==undefined || node.children[i]==undefined){ continue; } if(clazz){ if(node.children[i].getAttribute('cla

jquery的父、子、兄弟节点查找,节点的子节点循环方法_jquery

jQuery.parent(expr)           //找父元素 jQuery.parents(expr)          //找到所有祖先元素,不限于父元素 jQuery.children(expr)        //查找所有子元素,只会找到直接的孩子节点,不会返回所有子孙 jQuery.contents()            //查找下面的所有内容,包括节点和文本. jQuery.prev()                //查找上一个兄弟节点,不是所有的兄弟节点 jQue