将xml作为字符串而不是使用xstream的类

我有类似的xml

  15   

我不需要在父对象中创建消息对象,而是将消息表示为String。 所以,当我做parent.message时,输出是 15 而不是消息对象。

idia是通过处理HierarchicalStreamReader来构建消息的xml。 如果你通过调用reader.goDown()进入 ,遗憾的是reader.getValue()不会返回此元素的全部内容。

模型

  @XStreamAlias("parent") @XStreamConverter(value = ParentConverter.class) public class Parent { private final String message; public Parent(final String message) { this.message = message; } public String getMessage() { return message; } } 

变流器

  public class ParentConverter implements Converter { @Override public boolean canConvert(@SuppressWarnings("rawtypes") final Class type) { return Parent.class.isAssignableFrom(type); } @Override public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { throw new UnsupportedOperationException("unmarshaling only"); } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { reader.moveDown(); if (!"message".equals(reader.getNodeName())) { throw new ConversionException("Expected message, but was " + reader.getNodeName()); } final StringBuilder message = new StringBuilder(); while (reader.hasMoreChildren()) { reader.moveDown(); buildRecursiveMessage(reader, message); reader.moveUp(); } reader.moveUp(); final Parent parent = new Parent(message.toString()); return parent; } private void buildRecursiveMessage(final HierarchicalStreamReader reader, final StringBuilder sb) { // Build start-tag final String nodeName = reader.getNodeName(); sb.append("<" + nodeName); // Build attributes final int numAttributes = reader.getAttributeCount(); if (numAttributes > 0) { sb.append(" "); for (int i = 0; i < numAttributes; i++) { final String attributeName = reader.getAttributeName(i); final String attributeValue = reader.getAttribute(i); sb.append(attributeName + "=\"" + attributeValue + "\""); final boolean lastAttribute = (i == numAttributes - 1); if (!lastAttribute) { sb.append(", "); } } } // Build children final boolean containsChildren = reader.hasMoreChildren(); final boolean containsValue = !reader.getValue().isEmpty(); final boolean empty = !containsChildren && !containsValue; sb.append(!empty ? ">" : " />"); if (containsChildren) { while (reader.hasMoreChildren()) { reader.moveDown(); buildRecursiveMessage(reader, sb); reader.moveUp(); } } else if (containsValue) { sb.append(reader.getValue()); } // Build end-tag if (!empty) { sb.append(""); } } } 

这个测试

  public static void main(String[] args) { final XStream xstream = new XStream(); xstream.processAnnotations(Parent.class); // Deserialize final String xml = "15"; final Parent parent = (Parent) xstream.fromXML(xml); System.out.println(parent.getMessage()); } 

打印出来

  15 

但它并不是每一个相同的内容! 它忽略了例如空格, 将映射到并且我没有测试像' 这样的XML实体' 等等

也许最好将您的消息封装在CDATA标签中? 喜欢

    15 ]]>