0

サードパーティのサプライヤから提供された XML は、整形式ではありません。複数の XML 宣言があります。

<?xml version="1.0" encoding="utf-16"?><!DOCTYPE bob />
<?xml version="1.0"?><!DOCTYPE jim>

<elements>
...
</elements

私の逆シリアル化コード:

 var serializer = new XmlSerializer(response.GetType());

                reader = new XmlTextReader(stream) {XmlResolver = null};

                result = (IResponse) serializer.Deserialize(reader);

私が抱えている問題は、デシリアライザーが複数の XML 宣言について不平を言うことです。XML が正常に逆シリアル化されるように、宣言を削除する方法はありますか?

ありがとう

4

1 に答える 1

1

の周りにラッパーを記述できますXmlReader。これにより、後続の xml 処理命令と doctype が除外されます。

public class XmlFilteringReader : XmlReader
{
    private readonly XmlReader _source;
    private bool _gotXmlDeclaration = false;
    private bool _gotDoctype = false;

    public XmlFilteringReader(XmlReader source)
    {
        _source = source;
    }

    public override bool Read()
    {
        var ok = _source.Read();
        if (ok && _source.NodeType == XmlNodeType.ProcessingInstruction
                && _source.LocalName == "xml")
        {
            if (_gotXmlDeclaration) return Read(); // Recursive
            _gotXmlDeclaration = true;
        }
        else if (ok && _source.NodeType == XmlNodeType.DocumentType)
        {
            if (_gotDoctype) return Read(); // Recursive
            _gotDoctype = true;
        }
        return ok;
    }

    // Implementation of other methods and properties
    // by calling the same method or property on _source
}
var serializer = new XmlSerializer(response.GetType());
var reader = new XmlFilteringReader(new XmlTextReader(stream) {XmlResolver = null});
var result = (IResponse) serializer.Deserialize(reader);

実装は、 Mvp.XmlライブラリXmlWrappingReaderから使用することで簡素化できます。これに関するブログ投稿もあります。

于 2012-07-09T11:17:22.310 に答える