问题描述
<?xml version="1.0"?> <rss xmlns:g="http://base.google.com/ns/1.0" version="2.0"> <channel> <title>SSS Product Feed</title> <link>https://en-ae.sssports.com/</link> <description><![CDATA[The largest sports ]]></description> <item> <g:id>NIKE315122-001</g:id> <g:title><![CDATA[Nike Air Force 1 Low 07 Shoe]]></g:title> <g:sport>Lifestyle</g:sport> </item> <item> <g:id>NIKE315122-002</g:id> <g:title><![CDATA[Nike Air Force 1 Low 07 Shoe]]></g:title> <g:sport>Lifestyle</g:sport> </item> </channel> </rss>
这是我要读取和分析的示例XML文件...
我有这样的Java类...
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Rss { @XmlElement(name="channel") private Channel channel; public Channel getChannel() { return channel; } public void setChannel(Channel channel) { this.channel = channel; } }
另一个类是
@XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name="item") public class Item { @XmlElement(name="g:id") private String id; public String getId() { return id; } public void setId(String id) { this.id = id; }
,最后一个Item类是
public class Channel { private List<Item> itemList; @XmlElement(name="item") public List<Item> getItemList() { return itemList; } public void setItemList(List<Item> itemList) { this.itemList = itemList; } }
这就是我正在尝试做的事情..请帮助我做错了什么,因为我从XML中提取的所有值都返回空.....
推荐答案
您的Rss和Channel类在我看来还可以。 问题出在Item类中,尤其是其具有命名空间的元素中。
为<g:id>元素建模时,不得使用@XmlElement(name = "g:id")。 相反,您需要使用@XmlElement(name = "id", namespace = "http://base.google.com/ns/1.0")。 这与XML文件中给定的命名空间定义xmlns:g="http://base.google.com/ns/1.0"相对应。
顺便说一句:@XmlRootElement类上不需要@XmlRootElement。 您只需要在Rss类上使用它,因为<rss>是XML根元素。
完整的Item类如下所示:
@XmlAccessorType(XmlAccessType.FIELD) public class Item { @XmlElement(name = "id", namespace = "http://base.google.com/ns/1.0") private String id; @XmlElement(name = "title", namespace = "http://base.google.com/ns/1.0") private String title; @XmlElement(name = "sport", namespace = "http://base.google.com/ns/1.0") private String sport; // public getters and setters (omitted here for brevity) }
您可以在此处找到更多背景信息:
- XML Namespaces大体
- OracleJAXB tutorial一般用于JAXB
- @Xml... annotations的Javadoc
- 有关更多信息,只需在Internet上搜索JAXB教程命名空间