2015-07-02 43 views
1

我試圖用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_TYPEFIRST_ORDERED_NODE_TYPE並使用singleNodeValue

我試過使用null作爲命名空間參數。

我試過使用像//*[local-name() = 'field']這樣的東西。

我對名稱空間一般都不那麼舒服,所以也許有一些容易丟失的東西。

備用解決方案:創建一個新的XML變量,追加fields節點xmlDoc,並使用以下XPath://n:field[@name='a']。顯然,我需要更好地理解發生了什麼,但現在它與我所得到的一致,所以我會使用它。不過,對原始問題的任何建議都會非常有幫助。

感謝您的幫助!

回答

2

命名空間起初很痛苦,但容易處理。

以下XPath表達式將工作

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

n前綴(任意字符串將工作)表示使用命名空間。它作爲參數傳遞給用戶定義的名稱空間解析器函數。由於可能有多個名稱空間,因此您應該考慮到這一點。但對於你的示例xml只是返回http://ns.adobe.com/xfdf/的作品。

+1

感謝您的回覆。是的,當我使用備用解決方案時(我剛剛編輯原始帖子以反映這一點)時,這起作用,但我真的想用我發佈的原始javascript找到問題的解決方案 - 我根本不需要從'xmlDoc'中替換根節點。 –