尝试使用xml2js将XML解析为JSON,然后使用xmlbuilder将JSON返回给XML(通常在以编程方式修改内容之后)。
根据这篇文章https://github.com/oozcitak/xmlbuilder-js/issues/69,我认为两者应该是互补的。但是我遇到了一些困难,而且我必须得到正确的配置参数。这是我正在运行的代码:
var xml = fs.readFileSync(__dirname + '/../xml/theme.xml', 'utf8');
xml2js.parseString(xml, { attrkey: '@', xmlns: true }, function(err, json) {
var xml2 = xmlbuilder.create(json,
{version: '1.0', encoding: 'UTF-8', standalone: true}
).end({pretty: true, standalone: true})
});
这是原始XML的第一部分:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">
<a:themeElements>
<a:clrScheme name="Office">
<a:dk1>
<a:sysClr val="windowText" lastClr="000000"/>
</a:dk1>
<a:lt1>
<a:sysClr val="window" lastClr="FFFFFF"/>
</a:lt1>
<a:dk2>
<a:srgbClr val="1F497D"/>
</a:dk2>
...
</a:themeElements>
</a:theme>
这里; xml2js如何将其解析为JSON,这对我来说是正确的:
{
"a:theme": {
"@": {
"xmlns:a": {
"name": "xmlns:a",
"value": "http://schemas.openxmlformats.org/drawingml/2006/main",
"prefix": "xmlns",
"local": "a",
"uri": "http://www.w3.org/2000/xmlns/"
},
"name": {
"name": "name",
"value": "Office Theme",
"prefix": "",
"local": "name",
"uri": ""
}
},
"@ns": {
"uri": "http://schemas.openxmlformats.org/drawingml/2006/main",
"local": "theme"
},
"a:themeElements": [
{
"@ns": {
"uri": "http://schemas.openxmlformats.org/drawingml/2006/main",
"local": "themeElements"
},
"a:clrScheme": [
{
"@": {
"name": {
"name": "name",
"value": "Office",
"prefix": "",
"local": "name",
"uri": ""
}
},
"@ns": {
"uri": "http://schemas.openxmlformats.org/drawingml/2006/main",
"local": "clrScheme"
},
...
请注意,在上面的JSON中:
name=
)会转换为@
对象内的键并且现在,当xmlbuilder将其重新转换为XML时,它的外观如下:
<a:theme ="[object Object]" ns="[object Object]">
<a:themeElements ns="[object Object]">
<a:clrScheme ="[object Object]" ns="[object Object]">
<a:dk1 ns="[object Object]">
<a:sysClr ="[object Object]" ns="[object Object]"/>
</a:dk1>
<a:lt1 ns="[object Object]">
<a:sysClr ="[object Object]" ns="[object Object]"/>
</a:lt1>
...
</a:themeElements>
</a:theme>
因此,XML构建器面临两个问题:
*它无法识别@
对象中的属性名称
*它没有识别属性对象中的属性值
黑客看来xmlbuilder希望属性名称结构如下:
`{ "@name": "Office Theme"} `
而不是
`{ "@" : { "name" : { value: "Office Theme" }}}`
我应该以不同的方式配置xml2js,xmlbuilder是不同的,还是有一对不同的库可以解析XML - &gt; JSON - &gt; XML?
答案 0 :(得分:19)
xml2js package附带了自己的XML构建器,文档必须说明这一点:
从0.4.0开始,对象也可用于构建XML:
var fs = require('fs'), xml2js = require('xml2js'); var obj = {name: "Super", Surname: "Man", age: 23}; var builder = new xml2js.Builder(); var xml = builder.buildObject(obj);
此刻,双向一对一 只有默认配置才能保证转换,除了 attrkey,charkey和explicitArray选项,您可以重新定义到您的 味道。
因此,在删除自定义解析器配置后,这对我来说非常有用:
var fs = require('fs');
var path = require('path');
var xml2js = require('xml2js');
xmlFileToJs('theme.xml', function (err, obj) {
if (err) throw (err);
jsToXmlFile('theme2.xml', obj, function (err) {
if (err) console.log(err);
})
});
// -----------------------------------------------------------------------
function xmlFileToJs(filename, cb) {
var filepath = path.normalize(path.join(__dirname, filename));
fs.readFile(filepath, 'utf8', function (err, xmlStr) {
if (err) throw (err);
xml2js.parseString(xmlStr, {}, cb);
});
}
function jsToXmlFile(filename, obj, cb) {
var filepath = path.normalize(path.join(__dirname, filename));
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
fs.writeFile(filepath, xml, cb);
}
答案 1 :(得分:1)
我最近遇到了类似的要求。不得不将Yahoo weather service xml数据转换为json对象。解决了xml2js和js2xmlparser模块的问题。想分享我在这里做的事情。我制定了一个例子:
const https = require('https');
var parseString = require('xml2js').parseString;
https.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22surat%22)&format=xml&env=store%3A%2F%2F datatables.org%2Falltableswithkeys', (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
//console.log(JSON.parse(data).explanation);
parseString(data, function (err, result) {
console.log(JSON.stringify(result));
});
});
}).on("error", (err) => {
console.log("Error: " + err.message);
});
在此之后,可以使用js2xmlparser将获得的json转换为xml。
js2xmlparser.parse("weather", data);
....
这是详细代码的Github链接:https://github.com/joshiparthin/ReNode/tree/master/soap-api
答案 2 :(得分:0)
将XML转换为JSON时,xml2js将属性映射到&#39; $&#39;。如果您的属性键名称与子键名称不匹配。您可以将属性与子元素合并。你的JSON看起来很干净。
**
xml2js.Parser({ignoreAttrs:false,mergeAttrs:true})
**
可以解决您的问题。