对于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);