xpath的问题用javascript中的命名空间进行评估

时间:2014-09-17 15:46:24

标签: javascript xml 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 webservice调用的结果。

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.documentElement的外部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>

2 个答案:

答案 0 :(得分:1)

如果您事先知道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);

答案 1 :(得分:0)

感谢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);