JavaScript XPath для дочерних узлов, оценка не является функцией - PullRequest
0 голосов
/ 23 апреля 2020

Я использую обычный JavaScript для анализа xml результата, используя DOMParser. Я хочу перебрать определенные узлы и выполнить некоторую обработку каждого из них.

Проблема в том, что после получения рассматриваемых узлов через childNodes я не могу выполнить оценку XPath на этих узлах. Нужно ли как-то снова приводить узлы в xml? Или, может быть, использовать другую функцию?

У меня есть некоторый опыт работы с xpath на SQL Сервере, но не на JavaScript, так что это, вероятно, довольно тупой вопрос.

Вот мой xml

<result>
  <entry>
    <component typeCode="COMP">
      <sequenceNumber value="1" />
      <observation classCode="OBS" moodCode="DEF">
        <code displayName="StartDate" code="CODE_041" />
        <value xsi:type="TS" />
      </observation>
    </component>
    <component typeCode="COMP">
      <sequenceNumber value="2" />
      <observation classCode="OBS" moodCode="DEF">
        <code displayName="Amount" code="CODE_045" />
        <value xsi:type="PQ" value="000000000000000.00" />
      </observation>
    </component>
  </entry>
</result>

И код javascript

        parser = new DOMParser();
        xmlDoc = parser.parseFromString(xmltext, "text/xml");

        var ent = xmlDoc.getElementsByTagName("entry");

        // get child nodes
        var chil = ent[0].childNodes;
        for (var c = 0; c < chil.length; c++) {
            var nod = chil[c];
            // component
            if (nod.tagName == "component") {

                // error "evaluate is not a function"
                var field_code = nod.evaluate("/observation/code[@code]", nod, null, XPathResult.ANY_TYPE, null);
                var field_name = nod.evaluate("/observation/code[@displayName]", nod, null, XPathResult.ANY_TYPE, null);
            };
        };

1 Ответ

0 голосов
/ 23 апреля 2020

Я не могу понять, почему это происходит (xpath должен работать все время), но, поскольку я мог получить конечный результат другим способом, я подумал, что я мог бы также опубликовать его в случае, если это поможет. Если нет, то ничего плохого, я думаю.

xpath = require('xpath')
 , dom = require('xmldom').DOMParser; 
let xmlDoc = new dom().parseFromString(xmltext);

let ent = xpath.select("//component//observation/code", xmlDoc);
for (let [key, value] of Object.entries(ent)) {
  let field_code = `${value.getAttribute('code')}`;
  let field_name = `${value.getAttribute('displayName')}`;
   console.log('field code: ',field_code,'display name: ',field_name)
}

Вывод:

field code:  CODE_041 display name:  StartDate
field code:  CODE_045 display name:  Amount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...