SimpleXML Java - 读取根元素中的值

时间:2014-01-07 16:12:23

标签: android simple-framework

我使用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”已正确定义。

2 个答案:

答案 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);
}