2014-09-17 3 views
1

Я пытаюсь оценить простое выражение xpath.проблемы с оценкой xpath с пространствами имен в javascript

У меня есть объект 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 является результатом вызова мыла 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? Благодарю.

EDIT -

Это внешняя HTML для xn.ownerDocument.documentElement:

<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> 

ответ

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); 
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); 
Смежные вопросы