【问题标题】:Transform java objects to dynamic xml将 java 对象转换为动态 xml
【发布时间】:2011-06-15 11:44:53
【问题描述】:

我正在使用一个动态 xml 表格式,该格式由一个指定列名和类型的模式以及一个包含行的值标记组成。下面是xsd的简化版:

<xs:complexType name="data">
    <xs:sequence>
        <xs:element name="schema" type="schema"/>
        <xs:element name="values" type="values"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="schema">
    <xs:anyAttribute/>
</xs:complexType>

<xs:complexType name="values">
    <xs:anyAttribute/>
</xs:complexType>

还有一个由它生成的示例xml:

<data>
    <schema firstName="string" lastName="string" age="integer">
    <values>
        <value firstName="A" lastName="B" age="23"/>
        <value firstName="C" lastName="D" age="63"/>
        …
    </values>
</data>

生成 xml 的数据来自数据对象列表,例如:

public class Person {
    private String firstName;
    private String lastName;
    private int age;

    // getters and setters…
}

目前我正在通过向类中添加这样的代码来创建它(我正在使用 jaxb 来生成 xml):

private static QName FIRST_NAME = new QName("firstName");
private static QName LAST_NAME = new QName("lastName");
private static QName AGE = new QName("age");

private static Map<QName, String> schema;

static {
    schema = new HashMap<QName, String>();
    schema.put(FIRST_NAME, "string");
    schema.put(LAST_NAME, "string");
    schema.put(AGE, "integer"):
}

public Map<QName, String> asMap() {
    Map<QName, String> map = new HashMap<QName, String>();
    map.put(FIRST_NAME, firstName);
    map.put(LAST_NAME, lastName);
    map.put(AGE, Integer.toString(age)):
    return map;
}

public static Map<QName, String> getSchema() {
    return schema;
}

然后对用于生成 xml 的每个数据对象执行此操作。虽然我觉得这不是最好的解决方案,但这很有效。我看到的主要问题是模式和值之间没有联系,如果其中一个发生变化,您必须记住也要更新另一个。将它添加到所有课程中也有点吵。

有人可以提出一种更好(更简洁/更通用)的方法吗?也许有一些自动生成模式和/或值映射的好方法?或任何其他建议....

(如果我可以在不更改类的情况下在给定任何 java bean 的情况下获得可以工作的东西,那可能是最好的,但如果需要,我可以在类中装饰/添加东西。)

谢谢

【问题讨论】:

    标签: java xml dynamic auto-generate


    【解决方案1】:

    整个问题是表格是动态的。有必要吗?

    如果没有,解决方案很简单,因为您可以创建一个静态表,然后使用 JAXB 将其绑定到 Java bean。

    如果它确实需要是动态的,那么您唯一能做的就是使用自定义绑定器将表的静态实例链接到 Java bean。这意味着如果您有一个包含 firstName、lastName 和 age 的表的静态实例,那么您可以编写一个自定义绑定器,该绑定器将从该表生成 Java bean,它将具有正确的绑定(firstName、lastName 和 age),即您现在手动执行的操作。这种方法的问题在于编写绑定工具。

    但是使用现成的软件,最简单的做法是不使用动态表,而是为动态表的每个实例编写模式。这些模式中的 XML 文档仍然符合定义动态表的格式,但它允许您使用 JAXB 自动生成所有代码并使 Java 类与 XML 文档保持同步。

    【讨论】:

    • 同意。但是,要执行动态部分,可以首先将 POJO“序列化”为 Map,然后从 Map 转换为 XML(或 JSON 等)。这可能更容易解决问题。 JAXB 不能做前者(我认为),但从 commons beans-utils 到 Jackson 的任何东西都可以。
    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2012-12-22
    相关资源
    最近更新 更多