【发布时间】:2015-04-25 15:25:13
【问题描述】:
尝试使用 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 builder 面临两个问题:
* 它无法识别@ 对象中的属性名称,并且
* 它无法识别属性对象中的属性值
似乎 xmlbuilder 希望属性名称的结构如下:
`{ "@name": "Office Theme"} `
而不是
`{ "@" : { "name" : { value: "Office Theme" }}}`
我应该以不同的方式配置 xml2js、xmlbuilder,还是有一对不同的库可以解析 XML -> JSON -> XML?
【问题讨论】:
-
这种绕道 JSON 并返回的特定原因是否存在?当您最终想要 XML 时,直接修改 XML 似乎是更明智的方法......
-
好问题。在这种情况下,UI 和 DB 使用 JS/JSON 对象,因此将 XML 内容(例如 MS Office 文档)表示为 JSON 的能力允许通过混合对象来应用用户配置,而无需显式遍历 DOM。我希望后端会像
xml2js.parseString(xml, function(err, json) { _.mixin(json, edits); xmlbuilder.create(json).end();一样简单
标签: node.js xml-parsing xml-builder