使用javascript中的名称空间评估xpath的问题



我正在尝试计算一个简单的xpath表达式。

我有一个xml对象

var xn = response.resultXML; 

xn.outerHTML评估为:

<Result xmlns="http://url.com/services">
<AE>0</AE>
<FM>0</FM>
<OCX>0</OCX>
<TX>0</TX>
<AR>0</AR>
<Items>
    <RI>
        <PR>1</PR>
        <Date>2003-07-19T00:00:00</Date>
        <AR>228217.5600</AR>
        <AQ>19018.1300</AQ>
        <CBZ>13.519997630331753554502369668</CBZ>
        <XN>1.1266664691943127962085308057</XN>
        <AM>19018.1300</AM>
        <Unit>PerMonth</Unit>
        <UnitString>$/Month</UnitString>
        <DD>0.0</DD>
        <CR>0</CR>
    </RI>
</Items>
</Result>

我正在尝试使用以下查询来评估这个xml。xml是soap Web服务调用的结果。

var xdoc = xn.ownerDocument;
resolver = xdoc.createNSResolver(xdoc.documentElement);
var es = xdoc.evaluate("Items", xn, resolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
var node = es.singleNodeValue

我没有得到任何结果。有人能给我指明正确的方向来检索Items节点吗?谢谢

编辑-

这是xn.ownerDocument.dococumentElement:的外部HTML

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
    <Result xmlns="http://url.com/services">
        <AE>0</AE>
        <FM>0</FM>
        <OCX>0</OCX>
        <TX>0</TX>
        <AR>0</AR>
        <Items>
            <RI>
                <PR>1</PR>
                <Date>2003-07-19T00:00:00</Date>
                <AR>228217.5600</AR>
                <AQ>19018.1300</AQ>
                <CBZ>13.519997630331753554502369668</CBZ>
                <XN>1.1266664691943127962085308057</XN>
                <AM>19018.1300</AM>
                <Unit>PerMonth</Unit>
                <UnitString>$/Month</UnitString>
                <DD>0.0</DD>
                <CR>0</CR>
            </RI>
        </Items>
    </Result>
</soap:Body>
</soap:Envelope>

如果您事先知道Items元素的名称空间,那么只需执行

var es = xdoc.evaluate("//df:Items", xn, function(prefix) { if (prefix === 'df') { return 'http://url.com/services'; } else { return null; }}, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

感谢Martin Honnen-由于我不知道xml节点中的默认名称空间是什么,所以我稍微修改了他的回答。这现在对我有效。

var resolver = null;
var ns = (new window.DOMParser).parseFromString(xn.outerHTML, "text/xml").children[0].getAttribute("xmlns");
        if (ns)
        {
            resolver = function()
            {
                return ns;
            }
            xpath = "defaultNamespace:" + xpath;
        }
var es = xdoc.evaluate(xpath, xn, resolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

最新更新