我正在尝试计算一个简单的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);