使用 JAXB 解析嵌套 XML 时出现问题
Issues while parsing nested XML using JAXB
我无法使用 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 文件的正确方法是什么?
您的 POJO 应该更好地匹配您的行和列。我们创建一个 Column class(我选择了一个在 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;
}
我无法使用 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 文件的正确方法是什么?
您的 POJO 应该更好地匹配您的行和列。我们创建一个 Column class(我选择了一个在 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;
}