2014-10-10 25 views
0
工作

让我们开始像XML这样:不能使XPath来处理复杂的命名空间

<?xml version="1.0" encoding="UTF-8"?> 
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/" timeStamp="2009-11-26T15:21:36Z" uuid="02334fb6-3ae8-4094-9279-29ff59fc5bc8"> 
    <config xmlns="http://www.xfa.org/schema/xci/2.6/"> 
     ... 
    </config> 
    <template xmlns="http://www.xfa.org/schema/xfa-template/2.6/"> 
     <subform name="movie" w="196.85mm"> 
      <field name="duration" y="11.7mm" x="2.175mm" w="62mm" h="9mm"> 
       ... 
      </field> 
      <field name="imdb" y="11.7mm" x="65.675mm" w="62mm" h="9mm"> 
       ... 
      </field> 
      ... 
      <subform name="directors" layout="tb" x="2.175mm" y="30.75mm" w="95.25mm"> 
       ... 
       <field name="director" w="91.075mm" h="9mm"> 
        ... 
       </field> 
       ... 
      </subform> 
      ... 
     </subform> 
     ... 
    </template> 
    ... 
</xdp:xdp> 

(对于那些谁不知道,这是在this iText example使用PDF的XFA文件的简化版本。)

现在,我想所有的<field>元素在NodeListXPath将是完美的宗旨:

XPath xpath = XPathFactory.newInstance().newXPath(); 
xpath.setNamespaceContext(new NamespaceContext() { 
    public String getNamespaceURI(String p) { 
     return "http://www.xfa.org/schema/xfa-template/2.6/"; 
    } 
    public String getPrefix(String arg0) {return null;} 
    public Iterator<?> getPrefixes(String arg0) {return null;}  
}); 
NodeList fields = (NodeList)xpath.evaluate("//field", document, XPathConstants.NODESET); 

现在不起作用,结果是空的。我也试过在getNamespaceURI也回复null;如果前缀为"xdp"null,则返回"http://ns.adobe.com/xdp/"

我也试过手动得到<template>元素,并使用从该节点评估,上述NamespaceContextgetNamespaceURI返回null ...

一切似乎与这种过度复杂的系统工作,和我如果不知道自己做错了什么,就不想继续尝试。

+0

你的代码与简化的XML工作正常,我已经检查。 DOM解析。 – pasha701 2014-10-10 10:50:38

回答

1

您应该在路径中使用前缀,例如//df:field,然后确保前缀绑定到名称空间URI,例如

xpath.setNamespaceContext(new NamespaceContext() { 
    public String getNamespaceURI(String p) { 
     if (p.equals("df")) { 
     return "http://www.xfa.org/schema/xfa-template/2.6/"; 
     } 
    } 
    public String getPrefix(String arg0) {return null;} 
    public Iterator<?> getPrefixes(String arg0) {return null;}  
}); 
+0

这就是那些“哈哈!”之一时刻!谢谢。 P.S .:用p.equals(“df”)修复它,它是完美的;) – MaxArt 2014-10-10 11:03:54

+0

对不起,使用“==”来比较字符串,我更像是一个JavaScript或C#编码器而不是Java编码器。我编辑了代码示例以使用“equals”。 – 2014-10-10 11:20:10

+0

是的,我也是一个Javascript开发人员,并且坦率地说,Java比较字符串的方式非常刺激。 – MaxArt 2014-10-10 11:23:56