有没有针对XML绑定的JavaScript API - 类似于Java中的JAXB?

17

在Java中,我们经常使用JAXB2。对象<-> XML映射以Java类中的注释形式定义:

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

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

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

JAXB附带一个模式编译器(XJC),它可以从XML模式生成带有注释的类,这是另一个很棒的功能。


最近我们一直在大量使用客户端JavaScript,我们也需要在那里进行XML处理。例如,我们需要解析WPS文档,如此文档所示。这些文档也符合不同的XML模式(这里是WPS 1.0.0模式的示例XML)。使用JavaScript对象而不是XML将是非常好的,这可以节省大量的工作量。在某些情况下,我们可以使用基于JSON的解决方案,如DWR,但在许多情况下,我们确实需要在客户端处理XML。

我的问题是:

是否有适用于JavaScript的JAXB类似物?

是否有一些工具可以将XML模式编译成一些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()
      })
    }
  ]
});

这应该足够构建反序列化器或序列化器。

4个回答

29

3

我没有尝试过这个方法,所以不确定是否可行,但你考虑过使用GWT吗?这样你仍然可以使用JAXB并将整个应用程序编写为Java应用程序。我不确定GWT是否支持JAXB(可能不支持),但可能有一种替代的XML解析方式它会支持。如果这行得通,你可以通过GWT自动创建JavaScript模型,然后将其包含在应用程序中。是的,这比你想象的更加复杂,但它胜过从头开始编写。


2
你可以添加一个通用的样式表定义:XSLT到你的XML中,将它们转换为JSON格式。 例如:http://code.google.com/p/xml2json-xslt/ 与JSON相比,使用Javascript处理XML会更加麻烦,尤其是在跨浏览器环境下。样式表会给你的请求增加一些额外负担,不管是在服务器端还是客户端,都可以选择使用,但你必须将这个负担和使用Javascript在不同浏览器上解析和读取XML所需的代码复杂度和速度进行比较。

1
XSLT解决方案由于多种原因不太适合。首先,我们需要客户端处理。引入XSLT处理器来将XML转换为JSON过于繁重,无法接受。我认为在这里使用XSLT技术并不是最佳选择:可以用7K XSLT完成的工作可以用3K JavaScript完成 - 而且您不需要在客户端使用XSLT处理器。 - lexicore
1
其次,像您发布链接的那种XSLT并不是特定于模式的。例如,如果您有一个<item>foo</item>元素,则实际上不知道这是否必须是单个项目:'foo'还是数组项目:['foo']。拥有2010年,您不知道它是一年还是一个数字等等。在此处,XML<->对象映射必须派生自模式,以提供适当的结构和类型信息,而XML实例本身不提供。 - lexicore
在你的XML中添加像<?xml-stylesheet type="text/xml" href="xml2json.xsl"?>这样的头部,所有浏览器都可以理解,而不需要添加任何东西,或者你可以在服务器端进行处理(nginx非常擅长这方面)。转换为JSON意味着需要做出一些权衡,特别是涉及到模式、类型等方面...但对我来说,这种损失是值得的。 - Mic
"...值得失去" 没有意义。你在建议一些实际上不能完成 OP 想要做的事情。 - deoxxa

0

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

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

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


1
JSON对于JAXB的支持正是我所需要的。但在客户端,需要使用纯JavaScript。Jersey和Co.可以用于服务器端。目前我们有一个基于DWR的服务器端解决方案,也能很好地工作。但我需要一个仅限客户端的解决方案(服务器端代理仍然可以)。 - lexicore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接