我想我可能会因为我的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应该在没有我暗中协助的情况下进行编组。
简而言之,我迷路了哪里?!
答案 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>
在这种情况下,值将为“”。