2015-02-26 2 views
1

У меня есть следующий XSD тег:Xstream - Удалить значение тега

<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-б):

@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); 
} 

ответ

0

Одним из вариантов является созданием пользовательского конвертера для вашего объекта документации.

Посмотрите на XStream Converter tutorial

EDIT 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; 
} 

} 

сделал работу

1

XST стопа, обеспечивает стандартная реализация преобразователя называется 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).

+0

Я не могу изменить класс с момента его создания. – GregD

+1

@GregD достаточно справедливо, в этом случае просто используйте второй регистрационный механизм с 'registerConverter', тогда нет необходимости вносить какие-либо изменения в класс. –