Есть ли способ получить XStream для создания самозакрывающихся элементов?Закрывающие теги с XStream?
E.g.
<foo/>
вместо
<foo></foo>
Есть ли способ получить XStream для создания самозакрывающихся элементов?Закрывающие теги с XStream?
E.g.
<foo/>
вместо
<foo></foo>
Там, кажется, не быть явным образом сделать это, так как он не должен иметь значение для последующих процессоров XML.
Вы можете взглянуть на источник для класса PrettyPrintWriter
, который, вероятно, является тем, что он использует.
Я решил проблему, используя небольшое обходное решение. В частности, XStream печатает теги с закрытием только для не примитивного объекта; поэтому я заменил все объекты String классом Generic под названием «Element» только с одним атрибутом «value».
public class Element {
private String value;
public Element() {
}
public Element(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Таким образом, нулевые значения элемента будут напечатаны в формате XML в качестве selfclosing тегов (как я хочу)
После того как я написал пользовательский конвертер, чтобы избежать печати в XML тег для не пустых объектов.
public class CustomElementConverter implements Converter
{
public boolean canConvert(Class type)
{
return type.equals(Element.class);
}
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
String element = ((Element)source).getValue();
if (element != null) {
writer.setValue(element);
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
return null;
}
}
И это сработало! Надеюсь, это будет полезно кому-то другому.
Dom
вы можете использовать конвертер, а затем установите значение с помощью: writer.setValue ("");
так:
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
Ack ack = (Ack)source;
writeBasicAck(writer, ack);
writer.setValue("");
}
protected void writeBasicAck(HierarchicalStreamWriter writer, Ack ack) {
writer.addAttribute("pos", String.valueOf(ack.getPos()));
writer.addAttribute("ticket", String.valueOf(ack.getTicket()));
writer.addAttribute("estado", String.valueOf(ack.getEstado()));
writer.addAttribute("suc", String.valueOf(ack.getSucursal()));
}
это пишут:
<ackticket pos="2" ticket="123" estado="0" suc="1235"></ackticket>
вместо:
<ackticket pos="2" ticket="123" estado="0" suc="1235"/>