我正在使用XStream从几个Java类生成XML,我需要为某些元素指定名称空间限定属性;即xml:id和xlink:href attributes。
我正在使用StaxDriver,我可以使用QNameMap为元素配置名称空间,它只是我没有找到解决方案的属性的名称空间。
基本上,我有一个班级
@XStreamAlias("someElement")
public class SomeElement
{
@XStreamAsAttribute
String id = "foo";
@XStreamAsAttribute
String href = "http://bar"
}
我需要将其序列化为:
<someElement xml:id="foo" xlink:href="http://bar"/>
为了使问题复杂化,我不能假设任何名为'id'的属性应该变为“xml:id”,或者任何名为'href'的属性应该变为'xlink:href'。
答案 0 :(得分:8)
经过一段时间的谷歌搜索后,我想我找到了答案,解决方案比我想象的要简单。
我太聪明了,并且正在寻找一些方法来使一些组件“名称空间感知”,这是一场失败的战斗。我找到的解决方案是忘记StaxDriver和QNameMaps,只需使用@XStreamAsAttribute和@XStreamAlias按下字段来生成所需的命名空间属性。即。
@XStreamAlias("root")
class RootElement
{
@XStreamAsAttribute
final String xmlns = "http://www.example.org"
@XStreamAsAttribute
@XStreamAlias("xmlns:xlink")
final String xlink="http://www.w3.org/1999/xlink"
SomeElement someElement
}
class SomeElement
{
@XStreamAsAttribute
@XStreamAlias("xml:id")
String id
@XStreamAsAttribute
@XStreamAlias("xlink:href")
String href
}
通过上面的内容,我得到了所需的XML:
<root xmlns="http://www.example.org" xmlns:xlink="http://www.w3.org/1999/xlink">
<someElement xml:id="p1" xlink:href="http://www.example.org"/>
</root>
这可能不是最佳或适当的方式,但它确实做到了我现在所需要的。