問題描述
我有類似 xml 的東西
I have xml something like
<parent>
<message>
<type>15</type>
</message>
</parent>
我需要將 message 表示為 String ,而不是在父對象中創(chuàng)建消息對象.所以,當(dāng)我做 parent.message 時,輸出是 <type>15 </type>
而不是消息對象.
Instead of creating a message object inside parent object, I need to represent message just as a String . So , when I do parent.message , the output is <type> 15 </type>
instead of a message object.
推薦答案
idia是通過處理HierarchicalStreamReader
來構(gòu)建消息的xml.如果您通過調(diào)用 reader.goDown()
進(jìn)入 <messsage>
不幸的是 reader.getValue()
不會返回的全部內(nèi)容這個元素.
The idia is to build up the xml of message by processing the HierarchicalStreamReader
. If you go down into <messsage>
by calling reader.goDown()
unfortunately reader.getValue()
does not return the whole content of this element.
型號
@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; }
}
轉(zhuǎn)換器
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>
但內(nèi)容并不完全相同!它忽略例如空格, <foo></foo>
將映射到 <foo/>
并且我沒有測試像 這樣的 XML 實體'
等
But it is not every the same content! It ignores for example whitespaces, <foo></foo>
would mapped to <foo />
and I don't tested XML entities like '
etc.
也許最好將您的消息包含在 CDATA 標(biāo)記中?喜歡
Maybe it's better to enclose your message in CDATA tags? Like
<parent>
<message>
<![CDATA[
<type>15</type>
]]>
</message>
</parent>
這篇關(guān)于獲取 xml 作為字符串而不是使用 xstream 的類的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!