在Firefox中使用XPath名称空间

时间:2011-08-24 15:06:37

标签: javascript xml firefox xpath

我试图在Javascript中解析xml文件,同时忽略xml文件的命名空间。我预计xml文件的名称空间将来不会发生变化,但如果代码可以正常工作,即使命名空间确实发生任意变化,我也会更高兴。我试图关注these instructions失败。

我需要更改什么才能使我的第二个版本成功找到xml节点?下面是我的代码,它不能按预期工作。具体而言,第三次调用Components.utils.reportError输出null)。

Javascript(在firefox扩展中):

Components.utils.reportError("XML A: " + docky.documentElement);
var testxpath = '//' + docky.documentElement.tagName + ":entry";
Components.utils.reportError("Test XPath: " + testxpath);
Components.utils.reportError(docky.evaluate(testxpath, docky, 
    function(){return 'http://tempuri.org/';}, 
    XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue);

XML文件:

<OutputBlob xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns="http://tempuri.org/">
    <rnd>
        <double>0.23500252665719135</double>
        <double>0.82559380951597994</double>
        <double>0.33431208335529644</double>
        <double>0.91389494431852125</double>
    </rnd>
</OutputBlob>

输出:

XML A: [object Element]
Test XPath: //OutputBlob:entry
null

下面找到的代码变体(即,不涉及名称空间的位置)按预期工作。也就是说,对Components.utils.reportError的第三次调用不会输出null

Javascript(在firefox扩展中):

Components.utils.reportError("XML A: " + docky.documentElement);
var testxpath = '//' + docky.documentElement.tagName;
Components.utils.reportError("Test XPath: " + testxpath);
Components.utils.reportError(docky.evaluate(testxpath, docky, null, 
    XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue);

XML文件:

<OutputBlob xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
    <rnd>
        <double>0.23500252665719135</double>
        <double>0.82559380951597994</double>
        <double>0.33431208335529644</double>
        <double>0.91389494431852125</double>
    </rnd>
</OutputBlob>

输出:

XML A: [object Element]
Test XPath: //OutputBlob
[object Element]

1 个答案:

答案 0 :(得分:0)

修复:替换

var testxpath = '//' + docky.documentElement.tagName + ":entry";

var testxpath = '//entry:' + docky.documentElement.tagName;