我使用SimpleXML for Java来解析对java类映射的XML响应。但是,我无法使用我的Android设备使用这个特定的部分。
我的XML片段看起来像这样,
<t:EmailAddresses>
<t:Entry Key="EmailAddress1">sip:xxx@abs.com</t:Entry>
<t:Entry Key="EmailAddress2">smtp:xxx@abs.com</t:Entry>
<t:Entry Key="EmailAddress3">SMTP:xxx@abs.com</t:Entry>
</t:EmailAddresses>
我的EmailAddresses的Class定义如下所示,
@Root
public class EmailAddresses
{
@ElementList
private List<Entry> Entry;
public List<Entry> getEntry() { return Entry; }
public void setEntry(List<Entry> entry) { Entry = entry; }
}
我的Entry类看起来像这样,
@Element
public class Entry
{
@Attribute
private String Key;
public String getKey() { return Key; }
public void setKey(String key) { Key = key; }
}
当我解析运行解析器时,我只获得了密钥,并且在尝试将所有3解析为Entry类的列表时,我得到“多个根元素”错误。
有人可以指出我正确的方向吗?谢谢!!
注意:XML名称空间“t”已正确定义。
答案 0 :(得分:6)
以下是您应该更改的内容:
班级EmailAddresses
@Root(name = "EmailAddresses") /* 1 */
@Namespace(prefix = "t", reference = "INSERT YOUR REFERENCE HERE!") /* 2 */
public class EmailAddresses
{
@ElementList(inline = true) /* 3 */
private List<Entry> Entry;
// ...
}
<强>解释强>
/* 1 */
:设置元素的名称(区分大小写);简单来说,这是默认的,但所以你可以确保它是真的正确。/* 2 */
:设置命名空间及其引用; XML中的t
所必需的。/* 3 */
:内联列表; <t:EmailAddresses>
元素是由@Root()
元素构成的,所有条目都遵循为
内联元素。否则列表将创建另一个元素作为子元素,
包装它的条目。 班级Entry
@Root(name = "Entry") /* 1 */
@Namespace(prefix = "t", reference = "INSERT YOUR REFERENCE HERE!") /* 2 */
public class Entry
{
@Text
private String text; /* 3 */
@Attribute
private String Key;
// ...
}
<强>解释强>
/* 1 */
:请勿在此处使用@Element
,请使用@Root()
。/* 2 */
:正如上面的#2。/* 3 */
:您的Entry
- XML中的标记包含文字(=元素的值,如“sip:...”),那些也需要映射。如果文字是可选的,您可以使用@Text(required = false)
来表明。提示:创建列表实例,填入条目并序列化,例如:到一个文件。因此,您可以查看映射是否符合您的期望,以及您必须在哪里进行更正。
答案 1 :(得分:0)
您是否可以使用属性来提取数据?以下是来自RSS提要阅读器应用程序的片段,它类似地解析XML:
if (localName.equals("channel"))
{
/** Get attribute value */
String attr = attributes.getValue("category");
itemList.setTitle(attr);
}