Node.js使用xml2js从生成的XML中删除根节点

时间:2016-07-07 11:40:41

标签: xml node.js

我正在尝试从JSON obj创建XML并在结果中给我root元素,我尝试设置 explicitRoot var parser = xml2js.Parser({explicitRoot:false}); 为false但它不会删除默认的根标记,只是删除我的orignal XML根标记(<VSAT></VSAT>)

使用 xml2js

处理XML
<?xml version="1.0" encoding="utf-8"?>
<VAST version="2.0">    
    <Ad id="72419"></Ad>
</VAST>

产生的XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
<VAST version="2.0">    
<Ad id="72419"></Ad>
</VAST>
</root>

有什么想法吗?

完整代码

/*
NodeJS server
*/
var http = require('http');
var xml2js = require('xml2js');
var fs = require('fs');
var util = require('util');
var json,PORT=2000;

var server = http.createServer(function(request, response){
response.writeHead(200,{'Content-Type':'text/html'});
    try{
        var filedata = fs.readFileSync('vast_all.xml','ascii');

        var parser = xml2js.Parser({explicitRoot:true});
        parser.parseString(filedata.substring(0,filedata.length),function(err,result){
            result.new = 'test';
            json = JSON.stringify(result);

            var builder = new xml2js.Builder({
                xmldec:{ 'version': '1.0', 'encoding': 'UTF-8' },
                cdata:true,
            });

            var xml = builder.buildObject(json);
            response.write(json);
            /*console.log(util.inspect(builder, false, null));*/
        });

        response.end();
    }
    catch(e){
        console.log(e);
    }
});


console.log("Server running at port "+PORT);
try{
    server.listen(PORT);
}
catch(e){
    console.log(e);
}

4 个答案:

答案 0 :(得分:2)

在实例化Builder时将headless设置为true:

let builder = new xml2js.Builder({headless: true});

这对我有用。它删除了:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

但仅从版本0.4.3

支持此功能

答案 1 :(得分:1)

评论太长了。

使用xml2js从JSON创建XML的正确方法是使用xml2js.Builder。例如,在下面的代码片段中,JSON被更改为XML字符串,然后解析回JSON:

var fs = require('fs');
var xml2js = require('xml2js');

var data = { VAST: { '$': { version: '2.0' }
                   , Ad: { '$': { id: '72419' }, content: "yay" } } };
console.log("the JSON");
console.log(JSON.stringify(data));

// the JSON
// {"VAST":{"$":{"version":"2.0"},"Ad":{"$":{"id":"72419"},"content":"yay"}}}

var builder = new xml2js.Builder();
var xml = builder.buildObject(data);
console.log("result from xml2js.builder");
console.log(xml);  // this is a string

// result from xml2js.builder
// <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
// <VAST version="2.0">
//   <Ad id="72419">
//     <content>yay</content>
//   </Ad>
// </VAST>

var parser = new xml2js.Parser();
parser.parseString(xml, function(err, result) {
    console.log("result of parsing it back");
    console.log(JSON.stringify(result));
    console.log(result.VAST['Ad'][0]['$']['id']);  // you can get the id back
  });

// result of parsing it back
// {"VAST":{"$":{"version":"2.0"},"Ad":[{"$":{"id":"72419"},"content":["yay"]}]}}
// 72419

解析器添加了一个额外的数组("Ad":[{"$"),因为您可以拥有多个Ad标记(这样可以在以后以干净的方式访问节点中的内容)。

现在,如果你添加这个:

var badxml = builder.buildObject(xml);
console.log(badxml);

在该片段的末尾,您会获得一个带有额外root元素的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;VAST version="2.0"&gt;
  &lt;Ad id="72419"&gt;
    &lt;content&gt;yay&lt;/content&gt;
  &lt;/Ad&gt;
&lt;/VAST&gt;</root>

但它仍然与你得到的完全不同,因为它被正确转义。

答案 2 :(得分:0)

您不能删除根节点,但可以这样更改其名称:

 let builder = new xml2js.Builder({headless: true , explicitRoot : false , rootName :'Search_Query'});
 let xml = builder.buildObject(req.param('Search_Query'));

这会将root更改为Search_Query

答案 3 :(得分:0)

对于使用 js2xmlparser 的人来说,

const xml = js2xmlparser.parse("envelope_tag", {response : myJsonData}, {declaration: {include:false}})

res.send(xml);

我把它放在这里是因为这是关于 xml - json 的一个问题