如何不使用 XStream 反序列化嵌套的 XML 文档
How NOT to deserialise a nested XML document with XStream
我有这样的文档结构:
<MyDocument>
<MyChildDocument>
<SubElement>
...
</SubElement>
</MyChildDocument>
</MyDocument>
我想 XStream 将其反序列化为以下对象:
@XStreamAlias("MyDocument")
public class MyDocument {
String myChildDocument;
public String getMyChildDocument() {
return myChildDocument;
}
public void setMyChildDocument(String str) {
myChildDocument = str;
}
}
myChildDocument 变量应包含完整的子文档作为字符串,包括标签。
我还需要做这方面的序列化,避免 XStream 从实体编码包含在 myChildDocument 变量中的 XML 字符串。
我一直在寻找转换器来为我做这件事,但还没有找到一个好的方法。有什么想法吗?
我设法使用自定义转换器为此创建了一个解决方案。简而言之,编组时,将 MyChildDocument 的 XML 字符串输入 XML reader 并使用复印机将其反馈给创建编组结果的作者。在解组传入 XML!
时反转过程
public class MyExchangeConverter implements Converter {
protected static XmlPullParser pullParser;
protected static XmlPullParser getPullParser() {
if (pullParser == null) {
try {
pullParser = XmlPullParserFactory.newInstance().newPullParser();
}
catch (XmlPullParserException e) { } // Ah nuts!
}
return pullParser;
}
@Override
public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
return MyDocument.class.equals(type);
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer,
MarshallingContext context) {
MyDocument request = (MyDocument) source;
if (request.getMyChildDocument() != null) {
HierarchicalStreamReader reader;
reader = new XppReader(new StringReader(request.getMyChildDocument()), getPullParser());
HierarchicalStreamCopier copier = new HierarchicalStreamCopier();
copier.copy(reader, writer);
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
MyDocument response = new MyDocument();
reader.moveDown();
Writer out = new StringWriter();
HierarchicalStreamWriter writer = new CompactWriter(out);
HierarchicalStreamCopier copier = new HierarchicalStreamCopier();
copier.copy(reader, writer);
response.setMyChildDocument(out.toString());
reader.moveUp();
return response;
}
}
有些人会(正确地)争辩说,这会在一定程度上使系统受到 XML 注入攻击。确实如此,但对于我的特定用例,这不是我担心的风险。如果有人计划将此用于 public 面对未知远程方的接口或中间人攻击的风险,请注意这一点。您已被警告!
我有这样的文档结构:
<MyDocument>
<MyChildDocument>
<SubElement>
...
</SubElement>
</MyChildDocument>
</MyDocument>
我想 XStream 将其反序列化为以下对象:
@XStreamAlias("MyDocument")
public class MyDocument {
String myChildDocument;
public String getMyChildDocument() {
return myChildDocument;
}
public void setMyChildDocument(String str) {
myChildDocument = str;
}
}
myChildDocument 变量应包含完整的子文档作为字符串,包括标签。
我还需要做这方面的序列化,避免 XStream 从实体编码包含在 myChildDocument 变量中的 XML 字符串。
我一直在寻找转换器来为我做这件事,但还没有找到一个好的方法。有什么想法吗?
我设法使用自定义转换器为此创建了一个解决方案。简而言之,编组时,将 MyChildDocument 的 XML 字符串输入 XML reader 并使用复印机将其反馈给创建编组结果的作者。在解组传入 XML!
时反转过程public class MyExchangeConverter implements Converter {
protected static XmlPullParser pullParser;
protected static XmlPullParser getPullParser() {
if (pullParser == null) {
try {
pullParser = XmlPullParserFactory.newInstance().newPullParser();
}
catch (XmlPullParserException e) { } // Ah nuts!
}
return pullParser;
}
@Override
public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
return MyDocument.class.equals(type);
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer,
MarshallingContext context) {
MyDocument request = (MyDocument) source;
if (request.getMyChildDocument() != null) {
HierarchicalStreamReader reader;
reader = new XppReader(new StringReader(request.getMyChildDocument()), getPullParser());
HierarchicalStreamCopier copier = new HierarchicalStreamCopier();
copier.copy(reader, writer);
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
MyDocument response = new MyDocument();
reader.moveDown();
Writer out = new StringWriter();
HierarchicalStreamWriter writer = new CompactWriter(out);
HierarchicalStreamCopier copier = new HierarchicalStreamCopier();
copier.copy(reader, writer);
response.setMyChildDocument(out.toString());
reader.moveUp();
return response;
}
}
有些人会(正确地)争辩说,这会在一定程度上使系统受到 XML 注入攻击。确实如此,但对于我的特定用例,这不是我担心的风险。如果有人计划将此用于 public 面对未知远程方的接口或中间人攻击的风险,请注意这一点。您已被警告!