我正在尝试评估一个简单的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>
答案 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);