【问题标题】:SimpleXML Java - Read value in the root elementSimpleXML Java - 读取根元素中的值
【发布时间】:2014-01-09 03:21:27
【问题描述】:

我正在使用 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 类定义如下所示,

    @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 个元素解析为条目类列表时,我得到“多个根元素”错误。

有人可以指出我正确的方向吗?谢谢!!

注意:XML 命名空间“t”定义正确。

【问题讨论】:

    标签: android simple-framework


    【解决方案1】:

    你应该改变以下几点:

    班级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 */:设置元素的名称(区分大小写); simple 默认情况下会执行此操作,但您可以确保它确实正确。
    • /* 2 */:设置命名空间及其引用; XML 中的 t 是必需的。
    • /* 3 */:内联列表; &lt;t:EmailAddresses&gt; 元素由 @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 */:您在 XML 中的 Entry-tag 包含文本(= 元素的值,如 "sip:..."),这些需要映射也。如果文本是可选的,您可以使用@Text(required = false) 来表示。

    提示:创建一个列表实例,用条目填充它并对其进行序列化,例如成一个文件。因此,您可以查看映射是否符合您的期望,以及您必须在哪里进行一些更正。

    【讨论】:

    • 我要试试这个@ollo .. 我会回复你的。谢谢!!
    【解决方案2】:

    你不能使用属性来提取数据吗?这是一个来自 RSS 提要阅读器应用程序的 sn-p,它类似地解析 XML:

    if (localName.equals("channel"))
    {
        /** Get attribute value */
        String attr = attributes.getValue("category");
        itemList.setTitle(attr);
    }
    

    【讨论】:

    • 这如何适合我的 XML 片段?嗯..上面的代码是用 SimpleXML 吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多