我正在尝试使用jpm为Firefox 38创建一个附加组件,但是我使用XPath时遇到了问题,这让我很疯狂 - 我的结果是null或错误。我已经确认XML导入已正确完成,因为我可以使用xmlDoc.childNodes[1].nodeName
之类的命令从变量中读取信息。我读过的所有内容都表明这可能是名称空间问题,但我无法弄明白。
以下是导出的PDF文件(XFDF格式)中的XML:
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<f href="file.pdf"/>
<fields>
<field name="a">
<value>YES</value>
</field>
<field name="b">
<value>NO</value>
</field>
...
</fields>
<ids original="77A8B7EBDF7C3" modified="543E6D5A8B8BAD"/>
</xfdf>
这是我在附加组件中的javascript代码:
var fileContent = ... // data loaded from the above file
var {Cc, Ci} = require("chrome");
var parser = Cc["@mozilla.org/xmlextrasdomparser;1"].createInstance(Ci.nsIDOMParser);
var xmlDoc = parser.parseFromString(fileContent,"text/xml");
function resolver() {
return "http://ns.adobe.com/xfdf/";
}
var name = ... // one of the names from the PDF file (e.g. 'a', 'b', 'c', etc)
var xPath = "//n:field[@name='" + name + "']/n:value";
var type = Ci.nsIDOMXPathResult.STRING_TYPE;
var nodeVal = xmlDoc.evaluate(xPath, xmlDoc, resolver, type, null);
console.log(nodeVal.stringValue);
我尝试将STRING_TYPE
更改为FIRST_ORDERED_NODE_TYPE
并使用singleNodeValue
。
我尝试使用null
作为命名空间参数。
我尝试过使用像//*[local-name() = 'field']
这样的内容。
一般来说,我对名称空间不太满意,所以也许有些东西很容易丢失。
备用解决方案:创建新的XML变量,附加fields
的{{1}}节点,并使用以下XPath:xmlDoc
。显然,我需要更好地了解正在发生的事情,但是现在它适用于我所拥有的,所以我将使用它。不过,对原始问题的任何建议都会非常有用。
感谢您的帮助!
答案 0 :(得分:2)
命名空间起初很痛苦,但很容易解决。
以下XPath表达式将起作用
//n:field[@name='a']/n:value
n
前缀(任意字符串都可用)表示命名空间的使用。它作为参数传递给用户定义的命名空间解析器函数。由于可能有多个名称空间,因此您应该考虑到这一点。但对于您的样本xml,只需返回http://ns.adobe.com/xfdf/
即可。