【问题标题】:JavaScript XPath on childNodes, evaluate is not a functionchildNodes 上的 JavaScript XPath,评估不是函数
【发布时间】:2023-03-24 23:40:01
【问题描述】:

我正在使用纯 JavaScript 使用 DOMParser 解析 xml 结果。我想遍历某些节点,并对每个节点进行一些处理。

问题是,在通过childNodes 获取相关节点后,我无法在这些节点上运行 XPath 评估。我是否必须以某种方式再次将节点转换为 xml?或者也许使用不同的功能?

我有一些在 SQL Server 中使用 xpath 的经验,但在 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);
            };
        };

【问题讨论】:

    标签: javascript xml xpath


    【解决方案1】:

    我不知道为什么会发生这种情况(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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2018-10-30
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多