如何不使用 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 面对未知远程方的接口或中间人攻击的风险,请注意这一点。您已被警告!