Чтение содержимого тега с помощью XStream - PullRequest
0 голосов
/ 25 июля 2011

Я думаю, что я могу слишком сильно увеличивать масштаб с моей работой XStream, но я пытаюсь маршалировать поток XML, который содержит множество больших сложных объектов, и каждый из этих объектов имеет тенденцию иметь много теговнапример:

<name type="string">My Name</name>
<speed type="dice">2d6</speed>

Итак, я создал объект "TypedString", чтобы обернуть концепцию строки с атрибутом типа, например так:

import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
public class TypedString {
    @XStreamAsAttribute
    private String type;
    private String value;

    public TypedString(String type, String value) {
        this.type = type;
        this.value = value;
    }
    // getters omitted 
}

Теперь я знаюв этом должно быть что-то упущено - например, как я могу получить переменную «значение», используя содержимое тега (например, для первого примера, показанного выше, типом будет «строка», а значением будет «Мое имя»).

Я написал для этого краткий модульный тест:

public class TypedStringTest {
    private XStream xStream;

    @Before
    public void setUp() {
        xStream = new XStream();
        xStream.processAnnotations(TypedString.class);
        xStream.alias("name", TypedString.class);
    }

    @Test
    public void testBasicUnmarshalling() {
        TypedString typedString = (TypedString) xStream.fromXML("<name type=\"string\">Name</name>");
        assertEquals("string", typedString.getType());
        assertEquals("Name", typedString.getValue());
    }
}

, который не выполняется во втором утверждении.

Есть ли аннотация, которую нужно добавить в класс TypedString, чтобы получить егоза работой ?Или я действительно увеличил масштаб здесь (например, все ли это нужно делать для аннотаций в классе, содержащем эти теги?).Аннотация @XStreamAsAttribute не выглядела так, как будто ее можно использовать из родительского тега - ее нужно было определить для объекта, представляющего тег, к которому применяется, из того, что я мог сказать.Поэтому я сделал то, что в противном случае было прославленной строкой, которую, как мне кажется, XStream должен собирать без моей неявной помощи.

В двух словах, где я заблудился?!

Ответы [ 2 ]

1 голос
/ 20 января 2012
@XStreamAlias("name")
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"})
public class TypedString {
    private String type;
    private String value;
}
0 голосов
/ 29 июня 2015
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"})
public class TypedString {
    @XStreamAsAttribute
    private String type;
    private String value;
}

Работает для однострочных значений.

Если у вас что-то подобное, в качестве значения будут использоваться пробелы.

<name type="string">
    My Name
</name>

В этом случае значение будет "".

...