你的课有些问题:
- 你必须使用
@Root 来上课,而不是@Element
- 您的
@Namespace 是为类而不是属性设置的
- 因为 2. 你没有得到属性
- 您的命名空间的引用是否正确?
- 您的 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}]}