首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Jackson XML为具有相同标记的多个元素使用XML创建JAVA对象

使用Jackson XML为具有相同标记的多个元素使用XML创建JAVA对象
EN

Stack Overflow用户
提问于 2022-03-07 19:53:49
回答 1查看 282关注 0票数 0

我有以下XML结构,用于创建Java对象。

代码语言:javascript
运行
复制
<TABLE NAME="AB" ID="10" CODE="ABC123" RANK="102" YEAR="2022"
       TIMESTAMP="2021-05-11-16.19.44.572000">
    <TABLE NAME="CD">
        <ROW CODE="BCD456" SERIAL="A" ORDER="1" DESCRIPTION_1="TEST1"
             DESCRIPTION_2="TEST2 19" DESCRIPTION_3="TEST 3" STATUS_CODE="496" STATUS_INDICATOR="J"
             PRODUCT_NAME="SHIP ">
            <TABLE NAME="CD1">
                <ROW CD1_CODE=" 11N" CD1_DESCRIPTION="T"/>
                <ROW CD1_CODE=" 2KA" CD1_DESCRIPTION="T"/>
            </TABLE>
            <TABLE NAME="CD2">
                <ROW CD2_CODE="11" CD2_DESCRIPTION="----"/>
                <ROW CD2_CODE="12" CD2_DESCRIPTION="----"/>
                <ROW CD2_CODE="35" CD2_DESCRIPTION="----"/>
            </TABLE>
            <TABLE NAME="CD3"/>
        </ROW>
    </TABLE>
    <TABLE NAME="EF" CODE="EFG789">
        <ROW FILE="1" FILE_NAME="TEST.pdf" TIMESTAMP="2021-06-22T08:32:08.055854">
            <FILE_DATA>TESTDATA</FILE_DATA>
        </ROW>
    </TABLE>
</TABLE>

我已经创建了一个XMLMapper,如下所示,它从Java检索值。对我来说,主要的问题是当我在同一个父元素下的XML中有多个<TABLE>元素时。

在第一个场景中,<TABLE NAME="AB">有两个子表<TABLE NAME="CD"><TABLE NAME="EF">

在第二个场景中,<TABLE NAME="CD">有三个子表<TABLE NAME="CD1"><TABLE NAME="CD2"><TABLE NAME="CD3">以及后续的数据<ROW>

我试图使用下面提供的XMLMapper代码以及相关的Java类来存储来自XML的相关数据。我能够为<TABLE NAME = "CD1">及其子元素<ROW>验证存储在映射器中的数据

我已经尝试过在这个post中给出的答案,但是它并不完全适用于我的场景。

现在,我正在尝试从<TABLE NAME = "CD2">和`中检索和存储元素。这就是我收到一个错误声明的地方

代码语言:javascript
运行
复制
Multiple fields representing property "TABLE": createcsv.elements.CDRow#cd1Table vs createcsv.elements.CDRow#cd2Table

XMLMapperApp.java

代码语言:javascript
运行
复制
public class XmlMapperApp {

    public static void main(String[] args) {
        try {
            File xmlFile = new File("./resource/test.xml").getAbsoluteFile();
            XmlMapper xmlMapper = new XmlMapper();
            xmlMapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES);
            EmployeeXML employeeXML = xmlMapper.readValue(xmlFile, EmployeeXML.class);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

EmployeeXML.java

代码语言:javascript
运行
复制
@AllArgsConstructor
@NoArgsConstructor
@JacksonXmlRootElement(localName = "TABLE")
public class EmployeeXML {

    @JacksonXmlProperty(isAttribute = true, localName = "NAME")
    private String name;

    @JacksonXmlProperty(isAttribute = true, localName =  "ID")
    private String id;

    @JacksonXmlProperty(isAttribute = true, localName = "CODE")
    private String code;

    @JacksonXmlProperty(isAttribute = true, localName = "RANK")
    private String rank;

    @JacksonXmlProperty(isAttribute = true, localName = "YEAR")
    private String year;
    @JacksonXmlProperty(isAttribute = true, localName =  "TIMESTAMP")
    private String timestamp;

    @JacksonXmlProperty(localName = "TABLE")
    private CDTable cdTable;

    @JacksonXmlProperty(localName = "TABLE")
    private EFTable efTable;
}

RowElement.java

代码语言:javascript
运行
复制
public interface RowElement {
}

CDTable.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "TABLE")
public class CDTable {
    @JacksonXmlProperty(isAttribute = true, localName = "NAME")
    private String name;

    @JacksonXmlProperty(localName = "ROW")
    private CDRow cdRow;
}

CDRow.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "ROW")
public class CDRow implements RowElement {

    @JacksonXmlProperty(isAttribute = true, localName ="CODE")
    private String code;
    @JacksonXmlProperty(isAttribute = true, localName ="SERIAL")
    private String serial;
    @JacksonXmlProperty(isAttribute = true, localName ="ORDER")
    private String order;
    @JacksonXmlProperty(isAttribute = true, localName ="DESCRIPTION_1")
    private String benennung1;
    @JacksonXmlProperty(isAttribute = true, localName ="DESCRIPTION_2")
    private String benennung2;
    @JacksonXmlProperty(isAttribute = true, localName ="DESCRIPTION_3")
    private String benennung3;
    @JacksonXmlProperty(isAttribute = true, localName ="STATUS_CODE")
    private String statusCode;
    @JacksonXmlProperty(isAttribute = true, localName ="STATUS_INDICATOR")
    private String statusIndicator;
    @JacksonXmlProperty(isAttribute = true, localName ="PRODUCT_NAME")
    private String productName;

    @JacksonXmlProperty(localName = "TABLE")
    private CD1Table cd1Table;
    @JacksonXmlProperty(localName = "TABLE")
    private CD2Table cd2Table;
    @JacksonXmlProperty(localName = "TABLE")
    private CD3Table cd3Table;
}

CD1Table.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "TABLE")
public class CD1Table {
    @JacksonXmlProperty(isAttribute = true, localName = "NAME")
    private String name;

    @JacksonXmlProperty(localName = "ROW")
    private List<CDRow> cd1Row;
}

CD1Row.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "ROW")
public class CD1Row implements RowElement {
    @JacksonXmlProperty(isAttribute = true, localName ="CD1_CODE")
    private String cd1Code;
    @JacksonXmlProperty(isAttribute = true, localName ="CD1_DESCRIPTION")
    private String cd1Description;
}

CD2Table.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "TABLE")
public class CD2Table {
    @JacksonXmlProperty(isAttribute = true, localName = "NAME")
    private String name;
    @JacksonXmlProperty(localName = "ROW")
    private List<CD2Row> cd2Row;
}

CD2Row.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "ROW")
public class CD2Row implements RowElement {
    @JacksonXmlProperty(isAttribute = true, localName ="CD2_CODE")
    private String cd2Code;
    @JacksonXmlProperty(isAttribute = true, localName ="CD2_DESCRIPTION")
    private String cd2Description;
    @JacksonXmlProperty(localName = "TABLE")
    private CD3Table cd3Table;
}

CD3Table.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "TABLE")
public class CD3Table {
    @JacksonXmlProperty(isAttribute = true, localName = "NAME")
    private String name;
}

EFTable.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "TABLE")
public class EFTable {
    @JacksonXmlProperty(isAttribute = true, localName = "NAME")
    private String name;
    @JacksonXmlProperty(isAttribute = true, localName = "CODE")
    private String code;
    @JacksonXmlProperty(localName = "ROW")
    private EFRow efRow;
}

EFRow.java

代码语言:javascript
运行
复制
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "ROW")
public class EFRow implements RowElement {
    @JacksonXmlProperty(isAttribute = true, localName ="FILE")
    private String file;
    @JacksonXmlProperty(isAttribute = true, localName ="FILE_NAME")
    private String fileName;
    @JacksonXmlProperty(isAttribute = true, localName ="TIMESTAMP")
    private String timestamp;
    @JacksonXmlProperty(localName ="FILE_DATA")
    private String fileData;
}

我想知道是否有可能与上述其他类似方案一起解决这一情况,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-05-09 11:45:19

主表包含表,内表包含行。相同的标记有不同的结构,这是不可能的。为内部表创建包装表,仅此而已

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71386557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档