Android SimpleXml中的@Namespace

4 java xml android simple-framework

我有这个文件XML:

<Name  xml:lang="en">English</Name> <Name  xml:lang="it">Italian</Name>
Run Code Online (Sandbox Code Playgroud)

而我的班级:

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

    @Text
    private String title;

    @Override
    public String toString() {
        return title.toUpperCase() + "\n";
}
Run Code Online (Sandbox Code Playgroud)

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

TNKS

oll*_*llo 5

你班上有些不对劲:

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

如果您将类序列化为xml,您将得到如下内容:

<lang:name xmlns:lang="en">Example</lang:name>
Run Code Online (Sandbox Code Playgroud)

- >与您的输入不匹配.


这是一个更正版本:

@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";
    }
}
Run Code Online (Sandbox Code Playgroud)

这序列化为:

<name xml:lang="en" xmlns:xml="">English</name>
Run Code Online (Sandbox Code Playgroud)

请注意,还没有参考设置 - 但您可以忽略它的属性.

现在你将获得一个Name对象.但是,您的xml包含这些列表.因此,您需要另一个映射此列表的类:

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

对于测试,您也可以序列化:

<Names>
   <Name xml:lang="en" xmlns:xml="">English</Name>
   <Name xml:lang="it" xmlns:xml="">Italian</Name>
</Names>
Run Code Online (Sandbox Code Playgroud)

请注意那些标签.

这非常接近你的输入; 记住:xmlns:xml- 参考 - 可以忽略.所以只需更正你的xml.假设你有一个父元素Names:

<Names>
    <Name xml:lang=\"en\">English</Name>
    <Name xml:lang=\"it\">Italian</Name>
</Names>
Run Code Online (Sandbox Code Playgroud)

最后的测试现在:

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);
Run Code Online (Sandbox Code Playgroud)

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

NameList{names=[Name{text=English, attr=en}, Name{text=Italian, attr=it}]}
Run Code Online (Sandbox Code Playgroud)