【问题标题】:Android SimpleXML Parsing seems limited in DepthAndroid SimpleXML Parsing 的深度似乎有限
【发布时间】:2014-02-20 17:11:55
【问题描述】:

我正在尝试使用 Retrofit 和 SimpleXML 在 Android 上读取配置文件。

我已经设置了我的依赖项和一个有效的 XML 方案。简单的 XML 开始解析我的文档,但是当它达到某个标签/深度时,它会失败并出现以下错误

Caused by: retrofit.converter.ConversionException: org.simpleframework.xml.core.ElementException: Element 'Host' does not have a match in class
Caused by: org.simpleframework.xml.core.ElementException: Element 'Host' does not have a match in class

我的部分 xml 如下所示:

<Config>
    ...
    <Identity>
        <Address>
            <Host>...</Host>
            ...
        </Address>
        ...
     </Identity>
     ...
</Config>

它会解析所有内容,直到到达Host 标签,这是第一个嵌套那么深的元素。给出的错误通常表示缺少注释,但在这种情况下,它被注释为应有的注释。我的映射对象如下所示:

@Root(name="Config")
public class Config {

    @ElementList(entry="Identity", inline=true)
    private List<Identity> mIdentities;

    @Root(name="Identity")
    static class Identity {

        @Element(name="Address")
        private Address mAddress;

        ...

    }

    @Root(name="Address")
    static class Address {

        @Element(name="Host")
        private String mHost;

        ...
    }
}

是否有其他人遇到过类似问题并且知道问题可能是什么?还是 SimpleXML 受限于它可以达到的深度?也许这是与 ListElement 相关的问题?我找不到任何提及任何问题的文档。

【问题讨论】:

    标签: java android xml simple-framework


    【解决方案1】:

    此异常表示缺少注释类和 xml 之间的映射错误。也许嵌套不正确,使用了错误的注释等。

    这里很难说是什么原因,但是请确保您的代码看起来像这样:

    (伪代码,不是 testet!)

    @Root(name = "Address")
    public class Address
    {
        @Element(name="Host")
        private String mHost;
    
        // more things here ...
    }
    

    您能否测试一下您的问题,或者至少展示一下地址是如何实现的?顺便提一句。尝试相反的方向总是有帮助的:获取一个Config 对象,对其进行序列化并检查它是否按照您的要求构造。

    【讨论】:

    • 是的,所有内容都已正确注释,我已经仔细检查并尝试了 Element 和 Root 的子类。深度绝对没有限制吗?
    • 顺便说一句,我已经用映射类更新了我的问题
    • 请测试Config 对象的序列化(如果可能),它是否与您的输入匹配或是否也有任何错误?
    • XML 来自供应服务器,由模式验证,也用于编写映射,它绝对正确,在任何情况下都无法更改。星期五的最后一件事是,我将结构展平为最大深度为 3 个节点(即主机作为身份属性),它就可以工作了。我认为这可能是 SimpleXML 的限制,或者至少是 SimpleXML 在通过 Retrofit 使用时的限制
    • 作为后备解决方案,您应该考虑使用Converter 实现(有关详细信息,请参阅简单 Xml 文档)。使用转换器,您可以自己实现序列化/反序列化过程。所以不存在映射问题,只是有些东西要自己实现。
    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多