XML反序列化在DocType标记上失败

Mik*_*ill 4 c# doctype xmlserializer

我正在与第三方应用程序集成,该应用程序向我们发送XML消息.他们的XML看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE theirObj SYSTEM "theirDTD-2.0.dtd">
<theirObj>
    <properties>
        <datasource>ThirdParty</datasource>
        <datetime>2009-03-05T14:45:39</datetime>
    </properties>
        <data>
          ...
        </data>
</theirObj>
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用XmlSerializer反序列化它:

public theirObj Deserialize(string message) {
            if( string.IsNullOrWhiteSpace( message ) ) {
                throw new ArgumentNullException( "message" );
            }
            XmlSerializer xmlSerializer = new XmlSerializer( typeof(theirObj ) );

            TextReader textReader = new StringReader( message );

            using (XmlReader xmlReader = new XmlTextReader( textReader )) {
                object deserializedObject = xmlSerializer.Deserialize( xmlReader );

                theirObj ent = deserializedObject as theirObj ;

                if (ent == null) {
                    throw new InvalidCastException("Unable to cast deserialized object to an theirObj object. {0}".FormatInvariant( deserializedObject));
                }

                return ent;
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

我使用xsd.exe生成了对象.

如果我删除<!DOCTYPE>标签,那么它反序列化很好.

有没有办法让XmlSerializer忽略<!DOCTYPE>标签?

我知道我可以在将它传递给XmlSerializer之前将其删除,但如果我不需要,我宁愿不去那个级别的XML操作.

Mic*_*Liu 6

而不是使用的XmlTextReader,呼叫XmlReader.Create和传递一个XmlReaderSettings与对象DtdProcessing设置为Ignore:

TextReader textReader = new StringReader( message );
var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore };

using (XmlReader xmlReader = XmlReader.Create(textReader, settings))
Run Code Online (Sandbox Code Playgroud)

注意:DtdProcessing属性是在.NET 4.0中添加的.在.NET 3.5中,你可以改为设置ProhibitDtdfalseXmlResolvernull:

var settings = new XmlReaderSettings { ProhibitDtd = false, XmlResolver = null };
Run Code Online (Sandbox Code Playgroud)