在xml上使用带有XOM的默认命名空间应用xpath

时间:2013-01-15 11:18:31

标签: java xpath xml-namespaces xom

我的XML下面包含默认命名空间

<?xml version="1.0"?>
<catalog xmlns="http://www.edankert.com/examples/">
  <cd>
    <artist>Stoat</artist>
    <title>Future come and get me</title>
  </cd>
  <cd>
    <artist>Sufjan Stevens</artist>
    <title>Illinois</title>
  </cd>
  <cd>
    <artist>The White Stripes</artist>
    <title>Get behind me satan</title>
  </cd>
</catalog>

我正在运行以下代码,希望得到一些结果

Element rootElem = new Builder().build(xml).getRootElement();
xc = XPathContext.makeNamespaceContext(rootElem);
xc.addNamespace("", "http://www.edankert.com/examples/");   
Nodes matchedNodes = rootElem.query("cd/artist", xc);
System.out.println(matchedNodes.size());

但是大小总是为0。

我经历了

期待任何帮助。

1 个答案:

答案 0 :(得分:4)

XPath中的未加标签的名称始终表示“无名称空间” - 它们不尊重默认的名称空间声明。您需要使用前缀

Element rootElem = new Builder().build(xml).getRootElement();
xc = XPathContext.makeNamespaceContext(rootElem);
xc.addNamespace("ex", "http://www.edankert.com/examples/");   
Nodes matchedNodes = rootElem.query("ex:cd/ex:artist", xc);
System.out.println(matchedNodes.size());

XPath表达式使用原始文档没有的前缀并不重要,只要绑定到XPath名称空间上下文中的前缀的名称空间URI与绑定的URI相同即可。文档中的xmlns