【问题标题】:Is there a JavaScript API for XML binding - analog to JAXB for Java?是否有用于 XML 绑定的 JavaScript API - 类似于 Java 的 JAXB?
【发布时间】:2011-04-18 15:58:07
【问题描述】:

在 Java 中,我们经常使用 JAXB2。 ObjectXML 映射在 Java 类中被定义为注解:

@XmlRootElement(name="usertask", namespace="urn:test")
public class UserTask
{
    @XmlElement(namespace="urn:test")
    public String getAssignee() { ... }

    public void setAssignee(String assignee) { ... }
}

JAXB 运行时可以读取这些注释并创建解组器以将 XML 解析为对象实例或将对象编组为 XML。

JAXB 提供了一个模式编译器 (XJC),它可以从 XML 模式中生成带注释的类,这是另一个很棒的特性。


最近我们一直在使用客户端 JavaScript。我们还需要在那里进行 XML 处理。比如我们需要解析this one这样的WPS文档。这些文档也符合different XML schemas(这里是the WPS 1.0.0 schema 示例XML)。使用 JavaScript 对象而不是 XML 会很棒,这样可以节省大量的精力。在某些情况下,我们可以使用基于 JSON 的解决方案,例如 DWR,但在许多情况下,我们必须在客户端处理 XML。

我的问题是:

有没有类似 JAXB for JavaScript 的东西?

一些工具可以将 XML Schema 编译成一些 XML对象映射并提供运行时在 XML 和 JavaScript 对象之间进行转换?

我可以很容易地想象以如下形式生成的映射:

UserTask = new JSXML.XmlRootElement({
  name: "usertask",
  namespace: "urn:test",
  properties: [
    {
      assignee: new JSXML.XmlElement({
        name: "assignee",
        namespace: "urn:test",
        type: new JSXML.XSD.String()
      })
    }
  ]
});

这应该足以构建 unmarshaller 或 marshaller。

【问题讨论】:

    标签: javascript xml jaxb dwr jsonix


    【解决方案1】:

    迄今为止,我没有发现任何与我需要的相似的东西。因此,我决定自己实现它。这是项目页面:

    http://confluence.highsource.org/display/MISC/Jsonix

    项目托管在 GitHub 上:

    https://github.com/highsource/jsonix/

    【讨论】:

      【解决方案2】:

      我还没有尝试过,所以我不确定它是否会起作用,但是您是否考虑过使用 GWT 以便您仍然可以使用 JAXB 并将整个应用程序编写为 java 应用程序?我不确定 GWT 是否支持 JAXB(可能不支持),但它可能会支持 xml 解析的替代方法。如果这可行,您可以通过 gwt 自动创建您的 javascript 模型,然后将它们包含到您的应用程序中。是的,它比您想要的要复杂得多,但比必须从头开始编写要好。

      【讨论】:

        【解决方案3】:

        您可以做的是添加一个通用样式表定义:XSLT 到您的 XML 以将它们转换为 JSON。 例如:http://code.google.com/p/xml2json-xslt/

        与 JSON 相比,使用 Javascript 处理 XML 是一种痛苦,尤其是跨浏览器。
        样式表会为您的请求增加一点开销。在服务器端或客户端,您可以选择,但您必须将其与在不同浏览器上使用 Javascript 解析和读取 XML 的代码复杂度和速度进行比较。

        【讨论】:

        • XSLT 解决方案不适合的原因有很多。首先,我们需要一个客户端处理。使用 XSLT 处理器将 XML 转换为 JSON 过于繁重,无法接受。无论如何,我认为 XSLT 并不是这里最好的技术选择:7K XSLT 可以用 3K JavaScript 完成 - 而且客户端不需要 XSLT 处理器。
        • 第二,像您发布链接的 XSLT 不是特定于模式的。例如,如果你有一个 foo 元素,你实际上不知道它是否必须是单个项目:'foo' 或数组项目:['foo']。有了 2010 年,你不知道它是一年还是一个数字等等。 XML对象映射在这里必须是模式派生的,以提供 XML 实例本身不提供的适当结构和类型信息。
        • 在你的 XML 中添加一个像 <?xml-stylesheet type="text/xml" href="xml2json.xsl"?> 这样的标题是所有浏览器都可以理解的,而不需要添加任何东西,或者你可以让它成为服务器端(nginx 真的很擅长)。迁移到 JSON 意味着一些权衡,尤其是在模式、类型等方面……但对我来说,这是值得的。
        • “......值得损失”没有意义。您提出的建议实际上并没有完成 OP 想要做的事情。
        【解决方案4】:

        对于 JAXB 的 JSON 支持怎么样?重用您当前的 JAXB 注释模型类,但从您的 REST 端点输出 JSON。

        Jersey 的当前版本通过JSONJAXBContext 支持此功能(通过jersey-json 模块)。

        您也可以尝试JacksonJAXBJAX-RS 支持。

        【讨论】:

        • JSON 对 JAXB 的支持正是我所需要的。但在客户端,使用纯 JavaScript。 Jersey and Co. 可以在服务器端使用。现在我们有一个基于 DWR 的服务器端解决方案,它也可以正常工作。但我需要仅客户端的解决方案(服务器端代理仍然可以)。
        猜你喜欢
        • 2016-10-06
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 2015-07-23
        • 2015-05-20
        • 1970-01-01
        相关资源
        最近更新 更多