我正在尝试从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);
}
答案 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><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VAST version="2.0">
<Ad id="72419">
<content>yay</content>
</Ad>
</VAST></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 的一个问题