nodejs elementtree npm xml 解析

nodejs elementtree npm xml parsing

我正在尝试解析下面的示例 XML 文件,以从中获取一些数据。下面是 XML 文件:

<Benchmark xmlns="http://checklists.nist.gov/xccdf/1.1" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" id="SAP-HANA" resolved="1" xml:lang="en-US">
 <status date="2016-03-17">draft</status>
 <title xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="en-US">Guide to the Secure Configuration of SAP HANA</title>
 <version>0.1.28</version>

 <Profile id="profile1">
    <title xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="en-US">text1</title>
    <select idref="This is rule 1" selected="true"/>
    <set-value idref="ssfs_master_key_timeout">20</set-value>
 </Profile> 

 <Profile id="profile2">
    <title xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="en-US">text2</title>
    <select idref="this is rule1" selected="true"/>
    <select idref="this is rule1" selected="true"/>
    <select idref="this is rule1" selected="true"/>
 </Profile>
</Benchmark>

从这个 XML 文件中,我需要获取所有配置文件(profile1、profile2...),然后对于每个配置文件的标题标签,我需要获取其文本内容。我正在努力实现这样的目标:

for all profile in XML{
    get its attribute "id".
    get its <title> tag's text content.
}

例如下面是预期的输出:

profile1
text1
profile2
text2  // but in my code, it is always coming text1. I am not aware of, how to place [i] 

我可以得到id。但无法获取其标签的文本内容。这是我的代码:

var fs = require('fs'); 
var et = require('elementtree'); 
var XML = et.XML;
var ElementTree = et.ElementTree;
var element = et.Element;
var subElement = et.SubElement;

var data, etree;

data = fs.readFileSync('my.xml').toString();
etree = et.parse(data);
var length = etree.findall('./Profile').length;
for (var i = 0; i < length; i++) {
    console.log(etree.findall('./Profile')[i].get('id'));
    console.log(etree.findtext('./Profile/title'));  // dont know, where to place [i]

//  var profile = etree.findall('./Profile')[i].get('id');
//  console.log(etree.findtext('./Profile'[@id=’profile’]'/title'));

    //console.log(etree.findall('./Profile'[i]'/title'));
    //console.log(list[i]);
}

您可以获得这样的文本:

console.log(etree.findall('./Profile')[i].find('title').text);

但我也会重构代码一点,不要像这样多次调用 .findall:

var profiles = etree.findall('./Profile');

for (var i = 0; i < profiles.length; i++) {
 var profile = profiles[i];

 console.log(profile.get('id'));
 console.log(profile.find('title').text);
}

希望对您有所帮助。