让我们开始像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>
元素在NodeList
和XPath
将是完美的宗旨:
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>
元素,并使用从该节点评估,上述NamespaceContext
或getNamespaceURI
返回null
...
一切似乎与这种过度复杂的系统工作,和我如果不知道自己做错了什么,就不想继续尝试。
你的代码与简化的XML工作正常,我已经检查。 DOM解析。 – pasha701 2014-10-10 10:50:38