idia将通过处理来建立消息的xml
HierarchicalStreamReader。如果不幸地
<messsage>调用失败,则不会返回此元素的全部内容。
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("</" + nodeName + ">"); } } }这个测试
public static void main(String[] args) { final XStream xstream = new XStream(); xstream.processAnnotations(Parent.class); // Deserialize final String xml = "<parent><message><type>15</type></message></parent>"; final Parent parent = (Parent) xstream.fromXML(xml); System.out.println(parent.getMessage()); }打印出来
<type>15</type>
但这不是所有相同的内容!例如,它会忽略空格,它们
<foo></foo>会映射到空白,
<foo/>而我并未测试XML实体,例如
'etc。
最好将您的消息包含在CDATA标签中?喜欢
<parent> <message> <![CDATA[ <type>15</type> ]]> </message> </parent>



