【问题标题】:Issues while parsing nested XML using JAXB使用 JAXB 解析嵌套 XML 时的问题
【发布时间】:2019-03-12 12:04:03
【问题描述】:

我无法使用 jaxB 解析以下 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <Status>1</Status>
    <StatusMessage/>
    <ResultSet>
        <Columns count="2">
            <col type="Decimal">COL1</col>
            <col type="String">COL2</col>
        </Columns>
        <Rows count="3">
            <row index="0">
                <col index="0">1</col>
                <col index="1">ABC</col>
            </row>
            <row index="1">
                <col index="0">2</col>
                <col index="1">DEF</col>
            </row>
            <row index="2">
                <col index="0">3</col>
                <col index="1">XYZ</col>
            </row>
        </Rows>
    </ResultSet>
</Root>

这是我编写 java 对象的方式

    @XmlRootElement(name = "Root")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Root{

          @XmlElement(name="Status") 
          private String status;

          @XmlElement(name="StatusMessage") 
          private String statusMessage;

          @XmlElement(name="ResultSet")
          private ResultSet resultSet;
    }

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="ResultSet")
public class ResultSet {

    @XmlElement(name = "Columns")
    MyColumns cols;

    @XmlElementWrapper(name="Rows")

    @XmlElement(name = "row")
    List<MyRow> all;
}

@XmlRootElement(name = "Columns")
public class MyColumns {

    @XmlElement(name = "col")
    private String columns1;

    @XmlElement(name = "col")
    private String columns2;
}

@XmlRootElement(name = "row")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyRows {

    @XmlElement(name = "col")
    private String row1;

    @XmlElement(name = "col")
    private String row2;
}

解析时我没有收到任何异常,但 MyRows 和 MyColumns 中的数据为空。 我怀疑是 MyRows 中的 XMLElement 名称。这两个变量的名称都是“col”。因此它可能无法正确映射数据。

解析这个 xml 文件的正确方法是什么?

【问题讨论】:

    标签: java xml xml-parsing jaxb jaxb2-basics


    【解决方案1】:

    您的 POJO 应该更好地匹配您的行和列。我们创建一个 Column 类(我选择在 MyRow 和 MyColumns 中都使用一个 - 具有两者的属性)。

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Column {
    
        @XmlAttribute
        private String type;
        @XmlAttribute
        private String index;
        @XmlValue
        private String value;
    }
    

    更改 MyColumns 以使用它:

    @XmlRootElement(name = "Columns")
    public class MyColumns {
    
        @XmlElement(name = "col")
        private List<Column> columns;
    
    }
    

    MyRow 也一样:

    @XmlRootElement(name = "row")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class MyRow {
    
        @XmlAttribute
        private String index;
    
        @XmlElement(name = "col")
        private List<Column> columns;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 2013-04-06
      • 1970-01-01
      • 2021-10-20
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多