当字段是通用的,并且实际字段名称映射到其他地方时,使用JAXB映射XML?

时间:2018-03-22 13:58:29

标签: java xml xml-parsing jaxb

在我的java(/ spring / hibernate)Web应用程序中,我正在讨论这样的XML(为了示例目的,我已经将它简化了很多 - 我不能修改XML,因为我接收它来自第三方 - 我只控制客户端代码和客户端域对象 - 也没有XSD或WSDL来表示此XML):

<?xml version="1.0" encoding="utf-16"?>
<Records count="22321">
    <Metadata>
        <FieldDefinitions>
            <FieldDefinition id="4444" name="name" />
            <FieldDefinition id="5555" name="hair_color"  />
            <FieldDefinition id="6666" name="shoe_size" />
            <FieldDefinition id="7777" name="last_comment"/>
            <!-- around 100 more of these --> 
        </FieldDefinitions>
    </Metadata>

    <!-- Several complex object we don't care about here --> 

    <Record contentId="88484848475" >
        <Field id="4444" type="9">
            <Reference id="56765">Joe Bloggs</Reference>
        </Field>

        <Field id="5555" type="4">
            <ListValues>
                <ListValue id="290711" displayName="Red">Red</ListValue>
            </ListValues>
        </Field>

        <Field id="6666" type="4">
            <ListValues>
                <ListValue id="24325" displayName="10">10</ListValue>
            </ListValues>
        </Field>

        <Field id="7777" type="1">
            &lt;P&gt;long form text here with escaped XML here too
            don't need to process or derefernce the xml here, 
            just need to get it as string in my pojo&lt;P&gt;
        </Field>
    </Record>
    <Record><!-- another record obj here with same fields --> </Record>
    <Record><!-- another record obj here with same fields--> </Record>
    <!-- thousands more records in the sameish format --> 
</Records>

XML包含&#39;记录&#39;元素,其中包含一些元数据,然后大量的记录&#39;元素。每个记录元素都包含许多字段&#39;条目。

我的目标是使用JAXB将此XML解组为大量的记录&#39;对象。所以我可以这样做:

List<Record> unmarhsalledRecords = this.getRecordsFromXML(stringOfXmlShownAbove)

每条记录如下所示:

public class Record {
    private String name;
    private String hairColor;
    private String shoeSize;
    private String lastComment; 
    //lots more fields
    //getters and setters for these fields 
}

但是,我从来没有需要在jaxb中取消引用字段名称 - 甚至可以使用jaxb - 或者我是否需要使用stax解析器编写一些混乱/难以维护的代码?

我在网上找不到任何类似的例子 - 任何帮助都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

我不认为jaxb支持复杂的映射逻辑。我能想到的几个选项。

  1. 在使用jaxb解析之前,使用freemarker或xslt(我讨厌xslt)将xml转换为与所需模型匹配的xml格式
  2. 例如

    <Records>
        <Record>
            <Name>Joe Bloggs</Name>
            <HairColour>Red</HairColour>
            ...
        </Record>
    </Records>
    
    1. 按原样解析xml并在java层中编写适配器包装器,该适配器包装器从入站jaxb对象适应更多用户友好的&#34;模型。适配器层可以调用引擎盖下的jaxb对象,以便稍后在更改后序列化回xml