微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 JavaScript 解析 xml 并根据属性识别元素

如何解决如何使用 JavaScript 解析 xml 并根据属性识别元素

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

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

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

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

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);
});

解决方法

也许用 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; }

,

我对您的 .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. 循环遍历 result(对象数组)、props(我编写的父包装器)和 property 示例中 XML 文件中的子项。
  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)
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。