将java对象转换为动态xml
我正在使用一种动态xml表格式,它由一个指定列名和类型的模式以及一个包含行的值标记组成。xsd的简化版本如下:将java对象转换为动态xml,java,xml,dynamic,auto-generate,Java,Xml,Dynamic,Auto Generate,我正在使用一种动态xml表格式,它由一个指定列名和类型的模式以及一个包含行的值标记组成。xsd的简化版本如下: <xs:complexType name="data"> <xs:sequence> <xs:element name="schema" type="schema"/> <xs:element name="values" type="values"/> </xs:sequence>
<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>
目前,我通过向类中添加这样的代码来创建它(我使用jaxb生成xml):
private static QName FIRST\u NAME=新的QName(“firstName”);
私有静态QName LAST_NAME=新QName(“lastName”);
私有静态QName年龄=新QName(“年龄”);
私有静态映射模式;
静止的{
schema=newhashmap();
schema.put(名字“string”);
schema.put(姓氏,“string”);
schema.put(年龄,“整数”):
}
公共地图asMap(){
Map Map=newhashmap();
地图放置(名字,名字);
地图放置(姓氏、姓氏);
map.put(AGE,Integer.toString(AGE)):
返回图;
}
公共静态映射getSchema(){
返回模式;
}
然后对用于生成xml的每个数据对象执行该操作。虽然我觉得这不是最好的解决方案,但它仍然有效。我看到的主要问题是,模式和值之间没有联系,如果其中一个发生了变化,您必须记住也要更新另一个。此外,将其添加到所有类中也有点嘈杂
有人能推荐一种更好的(更干净/更通用的)方法吗?也许是自动生成模式和/或值映射的好方法?或任何其他建议
(如果我能在不改变类的情况下,在给定任何JavaBean的情况下拥有可以工作的东西,那可能是最好的,但是如果必要的话,我可以在类中装饰/添加一些东西。)
谢谢整个问题在于表格是动态的。需要吗 如果不是,那么解决方案就很简单,因为您可以创建一个静态表,然后使用JAXB将其绑定到JavaBean 如果它确实需要是动态的,那么您唯一能做的就是使用自定义绑定器将表的静态实例链接到JavaBean。这意味着,如果您有一个包含firstName、lastName和age的表的静态实例,那么您可以编写一个自定义绑定器,该绑定器将从该表生成Javabean,它将具有正确的绑定(firstName、lastName和age),这就是您现在手动执行的操作。这种方法的问题在于编写绑定工具
但是使用现成的软件,最简单的方法是不使用动态表,而是为动态表的每个实例编写模式。来自这些模式的XML文档仍然符合定义动态表的文档,但它允许您使用JAXB自动化所有代码生成,并使Java类与XML文档保持同步。同意。不过,要做动态部分,可以先将POJO“序列化”到映射,然后从映射到XML(或JSON等)。这可能会使问题更容易解决。JAXB不能做前者(我认为),但从commons beans utils到Jackson的任何东西都可以。
<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>
public class Person {
private String firstName;
private String lastName;
private int age;
// getters and setters…
}
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;
}