Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java对象转换为动态xml_Java_Xml_Dynamic_Auto Generate - Fatal编程技术网

将java对象转换为动态xml

将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>

我正在使用一种动态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>
目前,我通过向类中添加这样的代码来创建它(我使用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;
}