9

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 で次の点に注意してください。

  1. 属性 (例: name=) は@オブジェクト内のキーに変換され、
  2. 属性値はオブジェクトに変換されます

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 を解析できるライブラリの別のペアがありますか?

4

3 に答える 3

2

XML を JSON に変換する際、xml2js は属性を「$」に​​マップします。属性キー Name が Child Key Name と一致しない場合。属性を子要素とマージできます。したがって、JSON はきれいに見えます。

**

xml2js.Parser({ignoreAttrs : false, mergeAttrs : true})

**

あなたの問題を解決するかもしれません。

于 2016-11-22T11:02:52.243 に答える