【问题标题】:Generating Java Classes dynamically from an XML document从 XML 文档动态生成 Java 类
【发布时间】:2009-05-08 09:04:10
【问题描述】:

考虑这种情况:我有一个名为 person.xml 的 XML 文件,其中包含以下数据。

<person>
    <name>MrFoo</name>
    <age>28</age>
</person>

如果我想将此 XML 读入 Java 对象,我将创建一个名为 PersonBean(带有属性的 getter/setter)的 Java bean:

class Person{
    String name;
    int age;
}

我可以使用任何 API 来读取 XML 并填充 Java Bean。

但这里真正的问题是,假设如果 XML 文件的结构发生变化,即如果向 XML 文件添加了新属性“电子邮件”,那么我还必须修改 Java Bean 以添加新属性。但是,即使 XML 结构发生变化,我也想避免更改 Java 代码。

所以,我要做的是,我正在创建另一个名为 PersonStructure.xml 的 XML 文件,其内容为:

<class name="Person">
  <attributes>
      <attribute>
          <name>personName</name>
          <type>java.lang.String</type>
      </attribute>
      ... and it goes like this...
   </attribute>
</class>

是否可以读取 PersonStructure.XML 文件并将其转换为 Person.Java 类文件?我正在尝试做的方法是正确的还是有其他方法可以做到这一点?

【问题讨论】:

  • 一个小问题,您的 java 代码将如何处理新更改的对象?无论如何,您不必调整您的业务代码以使用新版本的 bean 吗?
  • 您的问题标题正确吗?听起来您想生成 java 对象,而不是 java 类。
  • 我想从 XML 文件创建 Java 类结构。 :)
  • @Nuno 此 XML 解析将成为大型 Web 应用程序的一部分,并且 XML 结构将来可能会发生变化。因此,为了避免重新部署整个 Web 应用程序,即使是很小的更改,我也在尝试这种方法。

标签: java xml reflection


【解决方案1】:

虽然这不是您想要做的,但您应该看看 JAXB。它可以从 Schema 定义中生成一组 Java 类。您的 PersonStructure.xml 文件看起来很像具有不同语法的 XSD,因此您可以重用 JAXB。

https://jaxb.dev.java.net/

【讨论】:

【解决方案2】:

对 Java 不太熟悉(我主要是 .NET 人),但常识适用:在动态生成的 bean 中实际上很少使用(除非您将它们绑定到某个控件,在这种情况下数组Objects 就可以了)。

更合乎逻辑的是从这个 XML 定义中对 Java bean 进行代码生成,这可以通过 XSLT 来完成。

PS。不要试图用 XML 制作编程语言。如果你这样做,地狱肯定会崩溃。

【讨论】:

    【解决方案3】:

    由于您希望容纳可能的新字段,因此 Map 比类对您更有用。

    用你的例子来说明,而不是这个:

    Person person = getPersonFromSomewhere();
    System.out.printf("%s was %d years old\n", person.name, person.age);
    person.age++; // happy birthday!
    

    ...你会这样做:

    Map<String, Object> person = getPersonFromSomewhere();
    System.out.printf("%s was %d years old\n", person.get("name"), person.get("age"));
    int currentAge = (Integer) person.get("age"); // real code would sanitise the value first
    person.put("age", currentAge + 1); // happy birthday!
    

    是的,这意味着更多的代码和更少的错误检查(编译器不会告诉你如果你拼错了'name'并且没有类型检查),但它会做你想要的。考虑到最佳实践是编写 getter 和 setter 代码而不是直接访问成员字段,在现实生活中无论如何你都会编写更多代码。

    如果您决定走这条路,请参阅this question 了解如何与 XML 进行转换。

    【讨论】:

      【解决方案4】:

      我正在以某种方式或多或少地遇到相同的问题(我需要将 Java 中的数据转换为 POM.xml 文件),其中一件事对我不起作用,但也许对你有用的是 XStream库,它将java类转换为xml,你应该看看:

      http://x-stream.github.io/

      无论如何,我都与他们有关,只是一个随机寻找自己答案的人。如果您对如何使用这个库有任何疑问,您应该尝试与他们联系。 希望它能解决你的问题。

      【讨论】:

        猜你喜欢
        • 2015-11-25
        • 1970-01-01
        • 2014-09-08
        • 2016-05-03
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        • 1970-01-01
        相关资源
        最近更新 更多