nodejs elementtree npm xml解析和合并 [英] nodejs elementtree npm xml parsing and merging

查看:138
本文介绍了nodejs elementtree npm xml解析和合并的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对与上次在以下帖子中发布的模块相同的问题.似乎,处理XML解析非常困难.由于elementTree具有非常庞大的文档.

I have a question on same module as I posted last time in below post. Seems like, it is quite difficult to deal with XML parsing. With elementTree having very mearge documentation.

我有一个下面的template_XML文件:

I have a below template_XML file:

<?xml version="1.0" encoding="UTF-8"?>
<Tailoring xmlns="http://checklists.nist.gov/xccdf/1.2" id="xccdf_org.open-scap_tailoring_example">
<status>incomplete</status>
<version time="2013-01-15T16:00:00.000+02:00">1.0</version>
    <Profile id="PlaceHolder">
    <title>Tailoring for py_test</title>
    <select idref="xccdf_rule_name" selected="true"/>
</Profile>
</Tailoring>

以及下面的sample_XML文件:

And a below sample_XML file:

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

我需要创建一个 new_xml 文件,一个 template_XML文件的副本. 但是要将 new_xml 文件中的" PlaceHolder "配置文件标记替换为 sample_XML 文件的" profile2 "标记.它是2个xml文件的合并并创建一个新文件. 下面是我尝试过的代码:

I need to create a new_xml file, a copy of template_XML file. But want to replace "PlaceHolder" profile tag in new_xml file with the "profile2" tag of sample_XML file. Its a kind of merging of 2 xml file and creating a new one. Below is the code I have tried:

function call(id){
    var template_XML = 'C:\\MyDrive\\template_XML';
    var new_xml = 'C:\\MyDrive\\new_xml';
    data = fs.readFileSync(template_XML).toString();
    data1 = fs.readFileSync(sample_XML).toString();
    etree = et.parse(data);
    etree1 = et.parse(data1);
    var profile = etree.find('./Profile');  // Getting the profile sub-element.
    etree.getroot().remove(profile)         // Removing the sub-element. So that I can insert new profile from sample file

    var profiles = etree1.findall('./Profile'); // Find the required profile.
    for (var i = 0; i < profiles.length; i++) {
        if(profiles[i].get('id') == 'profile2')
            var tmppro = profiles[i];
    }
    console.log(tmppro);
    etree.insert(3,tmppro);     // insert it. Failing

    var write = fs.openSync(new_xml, 'w');
    etree.write(write);                     // write it. Failing
}

由于一个或另一个原因,此代码在"etree.insert"和"etree.write"方面不起作用

For one or the other reason, this code is not working in terms of "etree.insert" and "etree.write"

推荐答案

最后,我能够使其与当前的lib一起使用. 请查看我的评论:

Finally I was able to make it working with current lib. Please see my comments:

'use strict';

const et = require('elementtree');
const path = require('path');
const fs = require('fs');

function populateXmlTemplate(id) {
	//Please use path.join to make it cross-platform
	var template_XML = path.join(__dirname, 'template.xml');
	var sample_XML = path.join(__dirname, 'sample.xml');
	var new_xml = path.join(__dirname, 'new.xml');

	var data = fs.readFileSync(template_XML).toString();
	var data1 = fs.readFileSync(sample_XML).toString();

	var etree = et.parse(data);
	var etree1 = et.parse(data1);

	var root = etree.getroot();

	var placeholder = root.find('./Profile');
	root.remove(placeholder);

	var profiles = etree1.findall('./Profile'); // Find the required profile.
	for (var i = 0; i < profiles.length; i++) {
		//If I get it right, it shouldn't be hardcoded
		if (profiles[i].get('id') == id) {
			var tmppro = profiles[i];
		}
	}

	//After you removed the placeholder the number of children decreased
	//So it should be 2, not 3.
	//Also etree doesn't have insert method, please call root.insert
	root.insert(2, tmppro);

	//You have been writing the document a bit incorrectly.
	var resultXml = etree.write();
	fs.writeFileSync(new_xml, resultXml);
}

populateXmlTemplate('profile2');

module.exports = {populateXmlTemplate};

但是您是对的,文档不是很好.它几乎不见了.因此大多数情况下,我只是调试查看可用的方法,还有一些测试在库回购中.

But you're right, the documentation is not good. It's mostly missing. So mostly I simply have been debugging it to see the available methods, also there are some tests in the lib repo.

还有其他与js一起使用的模块.请参阅此 answer .

There are other modules to work with js. Please see this answer.

这篇关于nodejs elementtree npm xml解析和合并的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆