如何不使用XStream反序列化嵌套的XML文档

时间:2015-02-13 01:01:11

标签: java xml serialization partial 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字符串进行实体编码。

我一直在寻找转换器来为我做这件事,但还没有找到一个很好的方法来做到这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我设法使用自定义转换器为此创建了一个解决方案。简单来说,在编组时,将MyChildDocument的XML字符串提供给XML阅读器,然后使用复印机将其反馈给正在创建编组结果的编写器。解组传入的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注入攻击。确实如此,但对于我的特定用例,这不是我担心的风险。如果有人计划将此用于面向公众的未知远程方接口或中间人攻击的风险,那么需要注意的事项。你被警告了!