使用XStream读取标记的内容

时间:2011-07-25 00:58:14

标签: annotations xstream

我想我可能会因为我的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 
}

现在,我知道这一定是缺少的东西 - 我如何使用标签的内容获取“value”变量集(例如,对于上面显示的第一个示例,type将是“string”,value将是“我的名字“)。

我为此写了一个简短的单元测试:

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

答案 0 :(得分:1)

@XStreamAlias("name")
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"})
public class TypedString {
    private String type;
    private String value;
}

答案 1 :(得分:0)

@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"})
public class TypedString {
    @XStreamAsAttribute
    private String type;
    private String value;
}

适用于单行值。

如果你有这样的东西,那么这个值将是一些空格。

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

在这种情况下,值将为“”。