Атрибуты пространства имен с помощью XStream - PullRequest
3 голосов
/ 01 декабря 2011

Я использую XStream для генерации XML из нескольких классов Java, и мне нужно указать квалифицированные атрибуты пространства имен для некоторых элементов;а именно атрибуты xml: id и xlink: href.

Я использую 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 Ответ

8 голосов
/ 03 декабря 2011

После немного большего поиска в Google, я думаю, что нашел ответ, и решение оказалось проще, чем я думал.

Я был слишком умен и искал какой-то способ сделать некоторый компонент "осведомленным о пространстве имен",и это была проигранная битва.Решение, которое я нашел, состояло в том, чтобы забыть о StaxDriver и QNameMaps и просто помассировать поля с помощью @XStreamAsAttribute и @XStreamAlias, чтобы сгенерировать необходимые атрибуты пространства имен.IE

@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>

Это, вероятно, не самый лучший или правильный способ сделать это, но он делает то, что мне нужнотеперь.

...