我正在使用一个动态 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 的情况下工作,那可能是最好的,但如果有必要,我可以在类中装饰/添加东西。)
谢谢