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 表示 ItemsItems 的包装器。

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
}