Java UnMarshall XML提供空对象

时间:2017-06-08 12:56:31

标签: java xml jaxb unmarshalling resttemplate

UnMarshalling XML提供null java对象。

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? 提前致谢。 :

3 个答案:

答案 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,其中@XmlElementWrapperItems的包装。

b)将Item移至@XmlAttribute

中的setter

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时这些字段保持为空的原因。

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
}