【问题标题】:Java UnMarshall XML gives null objectsJava UnMarshall XML 提供空对象
【发布时间】:2017-06-08 12:56:31
【问题描述】:

UnMarshalling XML 给出空 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 字符串

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 对象总是为空。如何正确解组 xml? 提前致谢。 :

【问题讨论】:

  • 你如何使用这些类?
  • 真正解组整个事情的代码在哪里?
  • Item 不是 XmlRootElement 恕我直言。
  • 是的,这个 xml 是不同的。它不包含像 . 这样的简单标签
  • @SarweshSethiya 你想说什么?很明显name是一个属性。

标签: java xml jaxb unmarshalling resttemplate


【解决方案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();
        }
    }

}

您应该得到包含Item s 的Items 对象。

我所做的更改:

a) 你需要一个 @XmlElementWrapper 在列表中,它表​​示 ItemsItems 的包装。

b) 将@XmlAttribute 移动到Item.java 中的设置器

c) 将@XmlElement 移动到Items.java 中的设置器

【讨论】:

    【解决方案2】:

    物品类别:

    public class Item {
        private String Name;
    }
    

    物品类别:

    @XmlRootElement(name = "Items")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Items {
    
        @XmlElement(name = "Item")
        private List<Item> items;
    }
    

    解组类:

            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();
            }
    

    【讨论】:

    • 不工作,Still Items 对象为空。
    【解决方案3】:

    您在 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多