【问题标题】:How to deserialize XML to JavaScript/TypeScript?如何将 XML 反序列化为 JavaScript/TypeScript?
【发布时间】:2014-08-31 22:42:11
【问题描述】:

我得到一个包含约会信息的 XML 结构。

我的代码:

function AppointmentCallback(appointment : any) {
}

我想在 JavaScript 或 TypeScript(首选)中将其转换为对象。在 jQuery 中,只有 parseXML 方法与我需要的相反。

有没有图书馆可以做到这一点?

提前致谢!

【问题讨论】:

  • 您是在浏览器中执行此操作,还是使用 node.js 或其他方式执行此操作?
  • uhm.. parseXML 将 xml 转换为 javascript 对象。您还能寻找什么?
  • @Benjamin Kovach 在浏览器中。 @Kevin B 在 jquery 页面上 link 它说它返回一个 XML Document。描述:将字符串解析为 XML 文档。我希望它从 xml 创建一个对象。
  • @KevinB 实际上它将 XML 转换为 DOM。显然这些是 JavaScript 对象,但它们包含足够的元数据来准确地重建原始文档,例如,通过保留节点顺序。转换为 $.parseXML 不做的普通旧 JavaScript 对象会丢失此信息。如果您只想消费,那可能并不重要。我在下面的回答贯穿了这些选项,但 JXON 可能最好地服务 POJO 路线:developer.mozilla.org/en-US/docs/Archive/…
  • 关于如何将xml转换为json的一些建议可以在this question找到。

标签: javascript xml parsing typescript deserialization


【解决方案1】:

MDN 在 JavaScript 中的 XML 序列化和反序列化方面有一个很好的 article,它涵盖了所有选项,而无需求助于 jQuery 等库。

旧版本的 IE(11 之前) - 以及当前版本的 Opera Mini - 有一些限制,如果您需要支持它们可能会导致问题。值得注意的是,DOMParser.parseFromString 缺失:Check this

如果您确实想要转换为 JavaScript 对象而不是使用 DOM,那么您可能想要查看的是 JXON。 Here's the way.

请注意,如果您想随时从对象重新创建 XML 文档,我建议您将其转换为 DOM 并直接使用 DOM 节点。这样,当您重新序列化它时,节点的顺序将被保留。如果你沿着普通的旧 JavaScript 对象路径走下去,排序将会丢失。

【讨论】:

  • 这是否为生成的对象提供代码补全?
【解决方案2】:

您也可以使用 JSONconvert 中的 serializeXmlNode

如下:Jsonconvert(doc)

【讨论】:

  • 这个答案似乎是指一个 C# 库。问题是关于 TypeScript。
【解决方案3】:

查看 cxsd 库 https://www.npmjs.com/package/cxsd,它将 xsd 解析为 typescript。它有一些奇怪的依赖关系。我不得不做一个 npm install --global --production windows-build-tools 还要确保 cxsd.cmd 包含在 PATH 它是一个 cli cxsd file.xsd 它输出一个带有生成的打字稿的 .d.ts 文件

【讨论】:

    【解决方案4】:

    cxml 可以将 XML 解析为 JSON,还可以在解析期间触发处理程序以在文件加载时对其进行处理。您可以使用 cxsd.xsd 架构文件编译为 TypeScript .d.ts 定义文件。解析后的输出也将是完全类型化的,因​​此像 Atom 或 tsc 编译器这样的 IDE 可以检查您是否正确处理了解析后的 JSON(元素和属性名称以及数据类型等)

    这是使用它的样子(更多示例in Github):

    import * as cxml from 'cxml';
    import * as example from 'cxml/test/xmlns/dir-example';
    
    var parser = new cxml.Parser();
    var result = parser.parse('<dir name="empty"></dir>', example.document);
    
    result.then((doc: example.document) => {
        console.log(JSON.stringify(doc, null, 2));
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-20
      • 2018-10-11
      • 1970-01-01
      • 2021-11-12
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多