XML:
<?xml version="1.0" encoding="UTF-8"?>
<Items>
<Item Name="John"/>
<Item Name="Jason"/>
</Items>
项目类:
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items{
@XmlElement
private List<Item> item;
public List<Item> getItem() {
return this.Item;
}
}
项目类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Item")
public class Item{
@XmlAttribute
private String name;
public String getName() {
return this.Name;
}
}
UnMarshalls的Java代码:这里result.getBody提供XML String
ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
JAXBContext jaxbContext = JAXBContext.newInstance(Items.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Items itResult = (Items) jaxbUnmarshaller.unmarshal(new StringReader(result.getBody()));
项目对象始终为空。如何正确解组xml? 提前致谢。 :
答案 0 :(得分:1)
使用以下类:
<强> Item.java 强>
@XmlRootElement(name = "Item")
public class Item
{
private String name;
public String getName()
{
return this.name;
}
@XmlAttribute(name = "Name" )
public void setName( String name )
{
this.name = name;
}
}
<强> Items.java 强>
@XmlRootElement(name = "Items")
public class Items
{
@XmlElementWrapper( name = "Items")
private List<Item> items = new ArrayList<Item>();
public List<Item> getItemList()
{
return this.items;
}
@XmlElement(name = "Item")
public void setItemList( List<Item> items )
{
this.items = items;
}
}
<强> Test.java 强>
public class Test
{
public static void main( String... args )
{
try
{
JAXBContext jaxbContext = JAXBContext.newInstance( Items.class );
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Items itResult = (Items) jaxbUnmarshaller.unmarshal( new File( "Items.xml" ) );
if ( itResult != null )
{
List<Item> items = itResult.getItemList();
for ( Item item : items )
{
System.out.println( item.getName() );
}
}
}
catch ( Exception e )
{
e.printStackTrace();
}
}
}
您应该获得包含Items
s的<{1}}对象。
我所做的改变:
a)您需要列表中的Item
,其中@XmlElementWrapper
是Items
的包装。
b)将Item
移至@XmlAttribute
c)将Item.java
移至@XmlElement
答案 1 :(得分:0)
项目类别:
public class Item {
private String Name;
}
项目类:
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items {
@XmlElement(name = "Item")
private List<Item> items;
}
Unmarshall课程:
JAXBContext jaxbContext;
Unmarshaller jaxbUnmarshaller;
try {
jaxbContext = JAXBContext.newInstance(Items.class);
jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Items itResult = (Items) jaxbUnmarshaller.unmarshal(file);
System.out.println(itResult);
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 2 :(得分:0)
您在JAXB注释中遗漏了一些(name = "...")
,
因此,您有一些与您的XML内容不匹配的默认名称。
这就是解组XML时这些字段保持为空的原因。
对于字段item
,您需要明确设置(name = "Item")
。
否则,您将获得默认名称"item"
,这是错误的。
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items {
@XmlElement(name = "Item")
private List<Item> item;
// ... getter
}
对于字段name
,您需要明确设置(name = "Name")
。
否则你会得到默认名称"name"
,这是错误的
顺便说一句,这里你不需要@XmlRootElement
,
因为它对非根元素没有影响。
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
@XmlAttribute(name = "Name")
private String name;
// ... getter
}