使用 JAXB 解组嵌套 XML
Unmarshall Nested XML with JAXB
我必须将 XML 解组为 POJO,但是 XML 结构不好,我找不到完成该操作的方法。
XML结构:
<CURRENT_VALUES>
<agency>
<value xsi:type="xs:long" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">123</value>
</agency>
<company>
<value xsi:type="xs:long" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1</value>
</company>
<channel>
<value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">TEST</value>
</channel>
</CURRENT_VALUES>
我创建了一个这样的 POJO:
public class EventoModel
{
private String agency;
private String company;
private String channel;
public String getAgency() {
return agency;
}
public void setAgency(String agency) {
this.agency = agency;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
}
问题是 "value" 元素。
当我尝试解组时,POJO 属性为空(或 null)。
JAXBContext jaxbContext = JAXBContext.newInstance(EventoModel.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
XMLOutputter outputter = new XMLOutputter();
StringReader reader = new StringReader(outputter.outputString(xml));
EventoModel evento = (EventoModel) unmarshaller.unmarshal(reader);
XML 元素 <agency>
、<company>
和 <channel>
具有相当复杂的嵌套结构。
因此,将它们建模为 Java String
属性太简单了。
相反,您需要一个单独的 POJO class。
因为这 3 个具有相同的结构,所以我们可以对它们使用一个通用的 class。
没有更好的名字让我们称之为 class Ìtem
。
请注意,所有 3 个属性都由 @XmlElement
.
注释
@XmlRootElement(name = "CURRENT_VALUES")
@XmlAccessorType(XmlAccessType.FIELD)
public class EventoModel
{
@XmlElement
private Item agency;
@XmlElement
private Item company;
@XmlElement
private Item channel;
// public getters and setters (omitted here for brevity)
}
Item
class 可以如下所示。
它包含一个名为 value
的 属性,对 XML 元素 <value>
建模。
再次注意,属性 被注释为 @XmlElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
@XmlElement
private Value value;
// public getters and setters (omitted here for brevity)
}
XML 元素 <value>
仍然相当复杂。
因此,我们还需要另一个 POJO class 来对其建模。我们称 class Value
.
<value ...>
和 </value>
之间的 XML 文本由 属性 建模
String text
需要注解 @XmlValue
.
XML 属性 xsi:type="..."
由 属性 建模
String type
需要用 @XmlAttribute
注释。
特别注意它的 namespace
参数对应于 XML 命名空间
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
.
给出
@XmlAccessorType(XmlAccessType.FIELD)
public class Value {
@XmlAttribute(namespace = "http://www.w3.org/2001/XMLSchema-instance")
private String type;
@XmlValue
private String text;
// public getters and setters (omitted here for brevity)
}
下面的屏幕截图(从调试器中截取)显示了整体
Java 结构并确认解组工作正常:
我必须将 XML 解组为 POJO,但是 XML 结构不好,我找不到完成该操作的方法。
XML结构:
<CURRENT_VALUES>
<agency>
<value xsi:type="xs:long" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">123</value>
</agency>
<company>
<value xsi:type="xs:long" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1</value>
</company>
<channel>
<value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">TEST</value>
</channel>
</CURRENT_VALUES>
我创建了一个这样的 POJO:
public class EventoModel
{
private String agency;
private String company;
private String channel;
public String getAgency() {
return agency;
}
public void setAgency(String agency) {
this.agency = agency;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
}
问题是 "value" 元素。
当我尝试解组时,POJO 属性为空(或 null)。
JAXBContext jaxbContext = JAXBContext.newInstance(EventoModel.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
XMLOutputter outputter = new XMLOutputter();
StringReader reader = new StringReader(outputter.outputString(xml));
EventoModel evento = (EventoModel) unmarshaller.unmarshal(reader);
XML 元素 <agency>
、<company>
和 <channel>
具有相当复杂的嵌套结构。
因此,将它们建模为 Java String
属性太简单了。
相反,您需要一个单独的 POJO class。
因为这 3 个具有相同的结构,所以我们可以对它们使用一个通用的 class。
没有更好的名字让我们称之为 class Ìtem
。
请注意,所有 3 个属性都由 @XmlElement
.
@XmlRootElement(name = "CURRENT_VALUES")
@XmlAccessorType(XmlAccessType.FIELD)
public class EventoModel
{
@XmlElement
private Item agency;
@XmlElement
private Item company;
@XmlElement
private Item channel;
// public getters and setters (omitted here for brevity)
}
Item
class 可以如下所示。
它包含一个名为 value
的 属性,对 XML 元素 <value>
建模。
再次注意,属性 被注释为 @XmlElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
@XmlElement
private Value value;
// public getters and setters (omitted here for brevity)
}
XML 元素 <value>
仍然相当复杂。
因此,我们还需要另一个 POJO class 来对其建模。我们称 class Value
.
<value ...>
和 </value>
之间的 XML 文本由 属性 建模
String text
需要注解 @XmlValue
.
XML 属性 xsi:type="..."
由 属性 建模
String type
需要用 @XmlAttribute
注释。
特别注意它的 namespace
参数对应于 XML 命名空间
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
.
@XmlAccessorType(XmlAccessType.FIELD)
public class Value {
@XmlAttribute(namespace = "http://www.w3.org/2001/XMLSchema-instance")
private String type;
@XmlValue
private String text;
// public getters and setters (omitted here for brevity)
}
下面的屏幕截图(从调试器中截取)显示了整体 Java 结构并确认解组工作正常: