Xstream - 删除值标签
Xstream - Remove value tag
我有以下 xsd 标签:
<xs:complexType name="documentation">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="language" use="required"/>
</xs:extension>
</xs:simpleContent>
这会生成(使用 jax-b):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "documentation", propOrder = {
"value"
})
public class Documentation {
@XmlValue
protected String value;
@XmlAttribute(name = "language", required = true)
protected String language;
我想要这样的输出:
<documentation language="NL">SomeValue</documentation>
但 Xstream 生成:
<documentation language="NL">
<value>SomeValue</value>
</documentation>
如何删除价值标签?我不要他们..
生成 xml 标签的代码(这只是一个片段..):
private void createDocumentation(Description description, String docNL) {
List<Documentation> documentations = description.getDocumentation();
Documentation documentationNL = new Documentation();
documentationNL.setLanguage("NL");
documentationNL.setValue(docNL);
documentations.add(documentationNL);
}
private void createXmlFile(Description description) {
XStream xstream = new XStream(new DomDriver());
xstream.alias("description", Description.class);
xstream.alias("documentation", Documentation.class);
xstream.addImplicitCollection(Description.class, "documentation");
xstream.useAttributeFor(Documentation.class, "language");
String xml = xstream.toXML(description);
}
一个选项是为您的文档对象创建自定义转换器。
编辑 TS:
添加:
xstream.registerConverter(new DocumentationConverter());
和
public class DocumentationConverter implements Converter {
public boolean canConvert(Class clazz) {
return clazz.equals(Documentation.class);
}
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
Documentation documentation = (Documentation) value;
writer.addAttribute("language", documentation.getLanguage());
writer.setValue(documentation.getValue());
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Documentation documentation = new Documentation();
reader.moveDown();
documentation.setLanguage(reader.getAttribute("language"));
documentation.setValue(reader.getValue());
reader.moveUp();
return documentation;
}
}
完成任务
XStream 提供了一个名为 ToAttributedValueConverter
的标准转换器实现,您可以像这样连接任何简单内容加属性类型:
@XStreamConverter(value = ToAttributedValueConverter.class, strings = { "value" })
public class Documentation {
protected String value;
protected String language;
}
strings
注解元素命名对应元素内容的属性,其他所有属性都将成为属性。如果您想使用 xstream.registerConverter
而不是使用 XStream 注释来声明转换器,那么您可以使用
xstream.registerConverter(new ToAttributedValueConverter(Documentation.class,
xstream.getMapper(), xstream.getReflectionProvider(), xstream.getConverterLookup(),
"value"));
(当您使用注释注册转换器时,Mapper
、ReflectionProvider
和 ConverterLookup
对象会自动提供给转换器,但必须为 registerConverter
显式提供) .
我有以下 xsd 标签:
<xs:complexType name="documentation">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="language" use="required"/>
</xs:extension>
</xs:simpleContent>
这会生成(使用 jax-b):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "documentation", propOrder = {
"value"
})
public class Documentation {
@XmlValue
protected String value;
@XmlAttribute(name = "language", required = true)
protected String language;
我想要这样的输出:
<documentation language="NL">SomeValue</documentation>
但 Xstream 生成:
<documentation language="NL">
<value>SomeValue</value>
</documentation>
如何删除价值标签?我不要他们..
生成 xml 标签的代码(这只是一个片段..):
private void createDocumentation(Description description, String docNL) {
List<Documentation> documentations = description.getDocumentation();
Documentation documentationNL = new Documentation();
documentationNL.setLanguage("NL");
documentationNL.setValue(docNL);
documentations.add(documentationNL);
}
private void createXmlFile(Description description) {
XStream xstream = new XStream(new DomDriver());
xstream.alias("description", Description.class);
xstream.alias("documentation", Documentation.class);
xstream.addImplicitCollection(Description.class, "documentation");
xstream.useAttributeFor(Documentation.class, "language");
String xml = xstream.toXML(description);
}
一个选项是为您的文档对象创建自定义转换器。
编辑 TS:
添加:
xstream.registerConverter(new DocumentationConverter());
和
public class DocumentationConverter implements Converter {
public boolean canConvert(Class clazz) {
return clazz.equals(Documentation.class);
}
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
Documentation documentation = (Documentation) value;
writer.addAttribute("language", documentation.getLanguage());
writer.setValue(documentation.getValue());
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
Documentation documentation = new Documentation();
reader.moveDown();
documentation.setLanguage(reader.getAttribute("language"));
documentation.setValue(reader.getValue());
reader.moveUp();
return documentation;
}
}
完成任务
XStream 提供了一个名为 ToAttributedValueConverter
的标准转换器实现,您可以像这样连接任何简单内容加属性类型:
@XStreamConverter(value = ToAttributedValueConverter.class, strings = { "value" })
public class Documentation {
protected String value;
protected String language;
}
strings
注解元素命名对应元素内容的属性,其他所有属性都将成为属性。如果您想使用 xstream.registerConverter
而不是使用 XStream 注释来声明转换器,那么您可以使用
xstream.registerConverter(new ToAttributedValueConverter(Documentation.class,
xstream.getMapper(), xstream.getReflectionProvider(), xstream.getConverterLookup(),
"value"));
(当您使用注释注册转换器时,Mapper
、ReflectionProvider
和 ConverterLookup
对象会自动提供给转换器,但必须为 registerConverter
显式提供) .