我試圖用jpm爲Firefox 38創建一個插件,但是我遇到了一個使用XPath的問題,這個問題導致我瘋了 - 我的結果要麼是空的,要麼是錯誤的。我已經確認了XML導入已正確完成,因爲我可以使用像xmlDoc.childNodes[1].nodeName
這樣的命令從變量中讀取信息。我讀過的所有內容都表明這可能是一個命名空間問題,但我無法弄清楚。在Firefox中使用XML的XPath插件
這裏是從導出PDF文件我的XML(XFDF格式):
<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
節點xmlDoc
,並使用以下XPath://n:field[@name='a']
。顯然,我需要更好地理解發生了什麼,但現在它與我所得到的一致,所以我會使用它。不過,對原始問題的任何建議都會非常有幫助。
感謝您的幫助!
感謝您的回覆。是的,當我使用備用解決方案時(我剛剛編輯原始帖子以反映這一點)時,這起作用,但我真的想用我發佈的原始javascript找到問題的解決方案 - 我根本不需要從'xmlDoc'中替換根節點。 –