【问题标题】:Format JSON as XML [closed]将 JSON 格式化为 XML [关闭]
【发布时间】:2021-01-23 14:20:03
【问题描述】:

我正在努力创建一个将 JSON 对象转换为 XML 的通用函数

注意:标题和正文中的列数可能会有所不同。此外,我对页脚中的值不感兴趣

我有以下 JSON 结构:

{
    "header": [ "Room", "Maximum Capacity" ],
    "footer": null,
    "body": [
        [ "Game Room", "0" ],
        [ "gymnasium", "" ],
        [ "Library", "200" ]
    ]
}

我想格式化:

<root>
  <row>
    <Room>Game Room</Room>
    <MaximumCapacity>0</MaximumCapacity>
  </row>
  <row>
    <Room>gymnasium</Room>
    <MaximumCapacity></MaximumCapacity>
  </row>
 <row>
    <Room>Library</Room>
    <MaximumCapacity>200</MaximumCapacity>
  </row>
</root>

【问题讨论】:

  • 这很好......但你还没有尝试任何东西吗?
  • 请说明您对此事做了哪些研究,以及您根据该研究做了哪些尝试。互联网上有数以千计的关于将 JSON 转换为 XML 并返回的工具和文章。
  • 感谢您的帮助。我花了几个小时寻找解决方案。所以当我向社区寻求帮助时,这是我收到的回应。如果我没有尝试过,我就不会寻求帮助。
  • 我明白,但是您在问题中添加什么您尝试过,以及在哪里您遇到了困难,这是否过于要求?供您参考,否决按钮上的工具提示显示“此问题未显示任何研究工作”。

标签: javascript json xml


【解决方案1】:

首先,我假设您已经将该 JSON 转换为 JavaScript 对象。

您应该将标头值转换为标签名称。这将涉及删除空格,但通常您可能需要做更多,以避免无效的标签名称。我将只关注这里的空间删除。

然后使用 DOMParser API 创建一个 XML 文档。这样可以避免 XML 标记内容中出现无效字符的陷阱。

根据从标头数据中收集的标签名称,迭代正文数据并动态创建 XML 节点。

这是如何工作的:

let obj = {
    "header": [ "Room", "Maximum Capacity" ],
    "footer": null,
    "body": [
        [ "Game Room", "0" ],
        [ "gymnasium", "" ],
        [ "Library", "200" ]
    ]
};

let tagNames = obj.header.map(name => name.replace(/\s*/g, ""));
let parser = new DOMParser();
let xmlDoc = parser.parseFromString("<root></root>", "text/xml");
let root = xmlDoc.getElementsByTagName("root")[0];
for (let data of obj.body) {
    let row = xmlDoc.createElement("row");
    for (let i = 0; i < tagNames.length; i++) {
        let cell = xmlDoc.createElement(tagNames[i]);
        cell.textContent = data[i];
        row.appendChild(cell);
    }
    root.appendChild(row);
}
var xmlString = new XMLSerializer().serializeToString(xmlDoc);
console.log(xmlString);

【讨论】:

    【解决方案2】:

    我认为这对你来说是一个很好的挑战,所以我没有给你一个解决方案,只是指出一些提示:

    • 您可以使用 JSON.parse 从字符串中解析 JSON
    • 您可以使用 Object.entries 来迭代 JSON 键/值对,例如Object.entries(json).forEach(([key, value]) =&gt; &lt;do the magic&gt;);
    • 您需要一个递归函数,因为 json(和 xml)的嵌套可以有多个层次。所以你可能会有这样的事情:
    function jsonToXml(json) {
      return Object.entries(json).map(([key, value]) => {
        if(isArray(value) || isObject(value)) { // TODO: Find out how to check if a variable is an array or object!
          return jsonToXml(value); // TODO: Think about on how wrap the value in the xml tag! 
        }
        return value // TODO: Think about on how wrap the value in the xml tag! 
      });
    }
    

    【讨论】: