如何解决如何使用 JavaScript 解析 xml 并根据属性识别元素
我正在使用 xml2js
将 xml
文件转换为 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>
我也...
- 进口
fs
- 将
output
更改为数组,因为您的函数将 xml 解析为对象数组 - 循环遍历
result
(对象数组)、props
(我编写的父包装器)和property
示例中 XML 文件中的子项。 - 循环检查您所需的条件并将对象推送到
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 举报,一经查实,本站将立刻删除。