Java UnMarshall XML 给出空对象
Java UnMarshall XML gives null objects
UnMarshalling XML 给出空 java 个对象。
XML :
<?xml version="1.0" encoding="UTF-8"?>
<Items>
<Item Name="John"/>
<Item Name="Jason"/>
</Items>
项目class:
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items{
@XmlElement
private List<Item> item;
public List<Item> getItem() {
return this.Item;
}
}
项目class:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Item")
public class Item{
@XmlAttribute
private String name;
public String getName() {
return this.Name;
}
}
Java UnMarshalls 的代码:这里 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()));
Item 对象始终为 null。如何正确解组 xml ?
提前致谢。 :
项目Class:
public class Item {
private String Name;
}
项目Class:
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items {
@XmlElement(name = "Item")
private List<Item> items;
}
解组 class:
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();
}
使用以下 类 :
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();
}
}
}
您应该得到包含 Item
s.
的 Items
对象
我所做的更改:
a) 您需要列表中的 @XmlElementWrapper
表示 Items
是 Item
s 的包装器。
b) 将 @XmlAttribute
移动到 Item.java
中的 setter
c) 将 @XmlElement
移动到 Items.java
中的 setter
您在 JAXB 注释中遗漏了一些 (name = "...")
,
因此,您得到了一些与您的 XML 内容不匹配的默认名称。
这就是为什么在解组 XML.
时这些字段保持为空的原因
Items.java
对于字段 item
,您需要明确设置 (name = "Item")
。
否则你会得到默认名称 "item"
,这是错误的。
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items {
@XmlElement(name = "Item")
private List<Item> item;
// ... getter
}
Item.java
对于字段 name
,您需要明确设置 (name = "Name")
。
否则你会得到默认名称 "name"
,这是错误的。
顺便说一下,这里不需要 @XmlRootElement
,
因为它对非根元素没有影响。
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
@XmlAttribute(name = "Name")
private String name;
// ... getter
}
UnMarshalling XML 给出空 java 个对象。
XML :
<?xml version="1.0" encoding="UTF-8"?>
<Items>
<Item Name="John"/>
<Item Name="Jason"/>
</Items>
项目class:
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items{
@XmlElement
private List<Item> item;
public List<Item> getItem() {
return this.Item;
}
}
项目class:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Item")
public class Item{
@XmlAttribute
private String name;
public String getName() {
return this.Name;
}
}
Java UnMarshalls 的代码:这里 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()));
Item 对象始终为 null。如何正确解组 xml ? 提前致谢。 :
项目Class:
public class Item {
private String Name;
}
项目Class:
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items {
@XmlElement(name = "Item")
private List<Item> items;
}
解组 class:
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();
}
使用以下 类 :
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();
}
}
}
您应该得到包含 Item
s.
Items
对象
我所做的更改:
a) 您需要列表中的 @XmlElementWrapper
表示 Items
是 Item
s 的包装器。
b) 将 @XmlAttribute
移动到 Item.java
c) 将 @XmlElement
移动到 Items.java
您在 JAXB 注释中遗漏了一些 (name = "...")
,
因此,您得到了一些与您的 XML 内容不匹配的默认名称。
这就是为什么在解组 XML.
Items.java
对于字段 item
,您需要明确设置 (name = "Item")
。
否则你会得到默认名称 "item"
,这是错误的。
@XmlRootElement(name = "Items")
@XmlAccessorType(XmlAccessType.FIELD)
public class Items {
@XmlElement(name = "Item")
private List<Item> item;
// ... getter
}
Item.java
对于字段 name
,您需要明确设置 (name = "Name")
。
否则你会得到默认名称 "name"
,这是错误的。
顺便说一下,这里不需要 @XmlRootElement
,
因为它对非根元素没有影响。
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
@XmlAttribute(name = "Name")
private String name;
// ... getter
}