【问题标题】:How to parse xml using JavaScript and identify elements based on attributes如何使用 JavaScript 解析 xml 并根据属性识别元素
【发布时间】:2021-04-26 13:31:08
【问题描述】:

我正在使用xml2jsxml 文件转换为javascript 对象。我需要识别 xml 文件中元素标签内的属性并操作匹配的元素。

例如,我在test.xml 中有一些property 元素:

...
<property name="TemporaryPort" type="input" required="true" order="0">
  <object>endpoint</object>
</property>
<property name="TemporaryPort" type="input" required="false" order="1">
  <object>endpoint</object>
</property>
<property name="TemporaryPort" type="output" required="false" order="2">
  <object>endpoint</object>
</property>
...

在解析此xml 文件的parse.js 文件中,我想根据元素的属性识别元素:

const xml2js = require('xml2js');
const xml = fs.readFileSync("test.xml");

let output = "";
const parser = new xml2js.Parser();
parser.parseString(xml, function(err,result){
  // I would like to find all elements where:
  // required is set to "true", 
  // name is set to "TemporaryPort", and 
  // type is set to "input"
  output="";
  console.log(output);
});

【问题讨论】:

    标签: javascript xml parsing xml2js


    【解决方案1】:

    我对您的 .xml 文件稍作更改,因为我看不到整个内容,但我认为它包含在父包装器中,我称之为 props

    <props>
        <property name="TemporaryPort" type="input" required="true" order="0">
        <object>endpoint</object>
        </property>
        <property name="TemporaryPort" type="input" required="false" order="1">
        <object>endpoint</object>
        </property>
        <property name="TemporaryPort" type="output" required="false" order="2">
        <object>endpoint</object>
        </property>
    </props>
    

    我也...

    1. 导入fs
    2. output 更改为数组,因为您的函数将 xml 解析为对象数组
    3. 循环遍历您示例中 XML 文件中的 result(对象数组)、props(我制作的父包装器)和 property 子代。
    4. 循环检查您需要的条件并将对象推送到output 数组,并在最后记录。
    const xml2js = require('xml2js');
    const fs = require('fs');
    
    const xml = fs.readFileSync("test.xml");
    
    const output = []
    const parser = new xml2js.Parser();
    
    parser.parseString(xml, function(err,result){
      result.props.property.forEach(prop => {
        prop['$'].required == 'true' &&
        prop['$'].name == 'TemporaryPort' &&
        prop['$'].type == 'input' &&
        output.push(prop)
      })
      console.log(output)
    });
    

    【讨论】:

      【解决方案2】:

      也许DOMParser()

      示例代码:

      const
        DomParser = new DOMParser()
      , XMLtext = `
        <data_xml>
          <property name="TemporaryPort" type="input" required="true" order="0">
            <object>endpoint 1</object>
          </property>
          <property name="TemporaryPort" type="input" required="false" order="1">
            <object>endpoint 2</object>
          </property>
          <property name="TemporaryPort" type="output" required="false" order="2">
            <object>endpoint 3</object>
          </property>
        </data_xml>`
        ;
      let XMLparsed = DomParser.parseFromString( XMLtext, 'application/xml')
        ;
      
      
        //  find all elements where:
      // required is set to "true", 
      // name is set to "TemporaryPort", and 
      // type is set to "input"  
       
      for (let nod of XMLparsed.querySelectorAll('data_xml property[name="TemporaryPort"][type="input"][required="true"]') )
        {
        for(let subChild of nod.children)
          {
          console.log( '---subChild name:', subChild.nodeName )  
          console.log( '----------content ->', subChild.textContent )  
          } 
        }
      console.log('\n\n\n')
      
      // otherwise:
      
      for (let nod of XMLparsed.querySelector('data_xml').children )
        {
        console.log( 'nodeName =', nod.nodeName)
        for(let attr of nod.attributes)
          {
          console.log('---> attribute: name=', attr.name, ',  value=', attr.value)
          }
        for(let subChild of nod.children)
          {
            console.log( '---subChild name:', subChild.nodeName )  
            console.log( '----------content ->', subChild.textContent )  
          }  
        }
      .as-console-wrapper {max-height: 100%!important;top:0; }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        相关资源
        最近更新 更多