XStream使用命名空间限定属性

时间:2011-12-01 02:46:25

标签: java xstream

我正在使用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'。

1 个答案:

答案 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>

这可能不是最佳或适当的方式,但它确实做到了我现在所需要的。