xml2jsを使用してXML を JSON に解析し、xmlbuilderを使用して JSON を XML に戻そうとします(通常、コンテンツをプログラムで変更した後)。
この投稿https://github.com/oozcitak/xmlbuilder-js/issues/69に従って、この 2 つは補完的なものであるべきだと思います。しかし、いくつかの問題があり、構成パラメーターを正しく取得していない可能性があります。
私が実行しているコードは次のとおりです。
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 ビルダーが直面している 2 つの問題があります。* オブジェクト内の属性名を認識してい@
ないことと、* 属性オブジェクト内の属性値を認識していないことです。
ハッキングすると、xmlbuilder は次のような構造の属性名を必要としているようです。
`{ "@name": "Office Theme"} `
それよりも
`{ "@" : { "name" : { value: "Office Theme" }}}`
xml2js を別の方法で構成する必要がありますか、xmlbuilder を別の方法で構成する必要がありますか、または XML -> JSON -> XML を解析できるライブラリの別のペアがありますか?