我有类似 xml 的东西
I have xml something like
<parent>
<message>
<type>15</type>
</message>
</parent>
我需要将 message 表示为 String ,而不是在父对象中创建消息对象.所以,当我做 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来构建消息的xml.如果您通过调用 reader.goDown() 进入 <messsage> 不幸的是 reader.getValue() 不会返回的全部内容这个元素.
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; }
}
转换器
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 实体' 等
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 标记中?喜欢
Maybe it's better to enclose your message in CDATA tags? Like
<parent>
<message>
<![CDATA[
<type>15</type>
]]>
</message>
</parent>
这篇关于获取 xml 作为字符串而不是使用 xstream 的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
上传进度侦听器未触发(Google 驱动器 API)Upload progress listener not fired (Google drive API)(上传进度侦听器未触发(Google 驱动器 API))
使用 Google Drive SDK 将文件保存在特定文件夹中Save file in specific folder with Google Drive SDK(使用 Google Drive SDK 将文件保存在特定文件夹中)
Google Drive Android API - 无效的 DriveId 和 Null ResourcGoogle Drive Android API - Invalid DriveId and Null ResourceId(Google Drive Android API - 无效的 DriveId 和 Null ResourceId)
谷歌驱动api服务账户查看上传文件到谷歌驱动使Google drive api services account view uploaded files to google drive using java(谷歌驱动api服务账户查看上传文件到谷歌驱动使用java
Google Drive 服务帐号返回 403 usageLimitsGoogle Drive service account returns 403 usageLimits(Google Drive 服务帐号返回 403 usageLimits)
com.google.api.client.json.jackson.JacksonFactory;Google Drcom.google.api.client.json.jackson.JacksonFactory; missing in Google Drive example(com.google.api.client.json.jackson.JacksonFactory;Google Drive 示例