【问题标题】:@Namespace in Android SimpleXmlAndroid SimpleXml 中的@Namespace
【发布时间】:2014-06-19 13:28:11
【问题描述】:

我有这个文件 XML:

<Name  xml:lang="en">English</Name> <Name  xml:lang="it">Italian</Name>

还有我的班级:

@Element
@Namespace(reference = "en", prefix = "lang")
public class Name {

    @Text
    private String title;

    @Override
    public String toString() {
        return title.toUpperCase() + "\n";
}

为什么我做toString时,它不只打印英文名字?

Tnk

【问题讨论】:

    标签: java android xml simple-framework


    【解决方案1】:

    你的课有些问题:

    1. 你必须使用@Root 来上课,而不是@Element
    2. 您的@Namespace 是为类而不是属性设置的
    3. 因为 2. 你没有得到属性
    4. 您的命名空间的引用是否正确?
    5. 您的 xml 是一个列表,而不是单个类

    如果你将你的类序列化为 xml,你会得到这样的结果:

    <lang:name xmlns:lang="en">Example</lang:name>
    

    --> 与您的输入不匹配。


    这是一个更正的版本:

    @Root(name = "Name")
    public class Name
    {
        @Text()
        private String text;
        @Attribute(name = "lang")
        @Namespace(prefix = "xml", reference = "") // Add your reference here!
        private String attr;
    
    
        @Override
        public String toString()
        {
            return text.toUpperCase() + "\n";
        }
    }
    

    这序列化为:

    <name xml:lang="en" xmlns:xml="">English</name>
    

    请注意,目前还没有设置 reference - 但您可以忽略它的属性。

    现在您将在一个对象中添加一个 Name。但是,您的 xml 包含这些列表。因此,您需要另一个类映射此列表:

    @Root(name = "Names")
    public class NameList
    {
        @ElementList(name = "Names", inline = true)
        private List<Name> names;
    }
    

    为了测试,你也可以序列化它:

    <Names>
       <Name xml:lang="en" xmlns:xml="">English</Name>
       <Name xml:lang="it" xmlns:xml="">Italian</Name>
    </Names>
    

    请注意周围的那些标签。

    这与您的输入非常接近;请记住:xmlns:xml - 参考 - 可以忽略。因此,只需更正您的 xml。假设你有一个父元素Names

    <Names>
        <Name xml:lang=\"en\">English</Name>
        <Name xml:lang=\"it\">Italian</Name>
    </Names>
    

    现在是最后的测试:

    final String xml = "<Names>"
                     +   "<Name xml:lang=\"en\">English</Name>"
                     +   "<Name xml:lang=\"it\">Italian</Name>"
                     + "</Names>";
    
    Serializer ser = new Persister();
    NameList names = ser.read(NameList.class, xml);
    
    System.out.println(names);
    

    两个条目都被正确反序列化为names。使用另一个toString()-方法,我得到了这个:

    NameList{names=[Name{text=English, attr=en}, Name{text=Italian, attr=it}]}
    

    【讨论】:

    • 这不是 100% 我一直在寻找的地方,但我认为你也可以帮助我。我有 2 个具有相同名称“链接”但具有另一个命名空间的元素。 &lt;ns1:link&gt;bla&lt;/ns1:link&gt;&lt;ns2:link&gt;bla&lt;/ns2:link&gt; 当我使用 @namespace(prefix="ns1")"ns2" 创建 2 个元素时出现错误:元素“链接”已与...一起使用。
    • @RoDo 你可以实现一个转换来做到这一点,我认为这应该可行。
    • 对不起,我得到了错误:名称的重复注释我写的错误是当我只实例化 1 @Element(name="link")" 字段时
    • @RoDo 我已经回答your question -- cmets 没有足够的空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多