在Firefox加载项中使用XPath on XML

时间:2015-07-02 19:46:36

标签: javascript xml xpath firefox-addon add-on

我正在尝试使用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。显然,我需要更好地了解正在发生的事情,但是现在它适用于我所拥有的,所以我将使用它。不过,对原始问题的任何建议都会非常有用。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

命名空间起初很痛苦,但很容易解决。

以下XPath表达式将起作用

//n:field[@name='a']/n:value

n前缀(任意字符串都可用)表示命名空间的使用。它作为参数传递给用户定义的命名空间解析器函数。由于可能有多个名称空间,因此您应该考虑到这一点。但对于您的样本xml,只需返回http://ns.adobe.com/xfdf/即可。