【问题标题】:Easiest parser in Java for xml to generate code for newcomer in xmlJava中最简单的xml解析器为xml中的新手生成代码
【发布时间】:2010-08-07 01:11:32
【问题描述】:

伙计们,我是 Java 中 xml 的新手。

我有以下任务。我需要解析一些 xml 文件(特别是 xcb-proto [X11])以在 java 中生成等效的请求协议。协议已经有一个定义良好的 xsd 和相应的 xml。解决此问题的最佳和最简单的方法/解析器是什么?

现有 xml 内容示例:

  <request name="SetScreenSaver" opcode="107">
    <pad bytes="1" />
    <field type="INT16" name="timeout" />
    <field type="INT16" name="interval" />
    <field type="CARD8" name="prefer_blanking" enum="Blanking" />
    <field type="CARD8" name="allow_exposures" enum="Exposures" />
  </request>

这将生成一个 Java DOM (?) 对象。他们用这个我需要用Java生成给定的代码。对于这种情况是:

期望的输出:

public void setScreenSaver(int timeout, int interval, int preferBlanking, int allowExposures) {
    RequestOutputStream o = outputStream;
    synchronized (o) {
        o.beginRequest(107, 0, 1); // Major Opcode , Minor Opcode, ReqLength
        o.writeInt16(timeout);
        o.writeInt16(interval);
        o.writeInt8(preferBlanking);
        o.writeInt8(allowExposures);
        o.send();
    }
}

似乎 XSOM 提供了一种更简单的方法...

PS:我从未在 Java 中操作过 xml 文件:3

【问题讨论】:

  • “最佳”怎么样?最快的?内存最少?免费授权? jar 文件的大小?作者会让你和他妹妹约会吗?这里需要一些细节。
  • 我想我现在已经把问题说清楚了。
  • @Will - 什么细节?作者姐姐的电话号码? :-)
  • 很遗憾我没有姐姐:3

标签: java xml parsing


【解决方案1】:

您应该研究一下 JAXB。它带有一个实用程序,可以使用 .XSD 文件生成所有 Java 代码以确定结构。

【讨论】:

  • 关闭,但我认为 OP 不想(只是)生成 Java 类来表示内存中的 XML 信息。代码示例显然是关于编组该信息(以非 XML 形式)并将其传输到其他东西。
  • Woot 看来这正是我想要的!我在这里阅读 JAXB 看起来真的很酷 ^_^
  • 我现在正在一个项目中使用它。如果您已经拥有一个定义良好的 XSD,并且只需要 Java 类来读取/写入该架构,那么这非常容易。
【解决方案2】:

即使使用 XSD 解析器,这也绝不是一件容易的事,尤其是当架构使用 XSD 语言的一些更困难的方面时。

如果这是一次性任务并且 XSD 不是很大,那么您最好只手动编写 Java 代码。

编辑

我可以想到一种使用 Eclipse / EMF 的迂回方法,可能简化事情:

  1. 使用 EMF 工具从 XSD 创建 EMF ECore 模型。这为您提供了一个类似于简单 UML 的内存中“对象模型”。
  2. 使用 EMF 基础架构(例如 JET),创建一个自定义生成器,该生成器遍历 ECore 模型并生成您的目标代码。

XSD to ECore 还为您提供(免费)生成的类,用于在内存中表示您的 XML、在树编辑器中对其进行编辑以及读取/写入 XML。相关技术处理数据库中的持久性、验证、模型到模型的转换以及其他事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2016-03-28
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多