C# DocType标记上的XML反序列化失败

C# DocType标记上的XML反序列化失败,c#,doctype,xmlserializer,C#,Doctype,Xmlserializer,我正在研究与第三方应用程序的集成,该应用程序向我们发送XML消息。他们的XML如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE theirObj SYSTEM "theirDTD-2.0.dtd"> <theirObj> <properties> <datasource>ThirdParty</datasource> <

我正在研究与第三方应用程序的集成,该应用程序向我们发送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>
我使用xsd.exe生成了这些对象

如果我删除
标记,那么它可以反序列化

有没有办法让XmlSerializer忽略
标记


我知道我可以在将其传递给XmlSerializer之前将其剥离出来,但如果不需要的话,我宁愿不进行那个级别的XML操作

DOCTYPE没有内置的XmlSerlization属性。事实上,这是因为XML序列化是基于元素而不是基于文档的。我认为可以使用以下方法跳过序列化中的DOCTYPE:

public static String Serialize(object obj)
{
    StringBuilder builder = new StringBuilder();
    XmlSerializer serializer = new XmlSerializer(typeof(theirObj));

    using (XmlWriter writer = XmlWriter.Create(builder, new XmlWriterSettings() { OmitXmlDeclaration = true }))
        xmlSerializer.Serialize(writer, obj);

    return builder.ToString();
}

然后,一旦文档被反序列化,您就可以将其重新注入。

您只需删除doctype即可

TextReader textReader = new StringReader( message );
XmlDocument XDoc = new XmlDocument();
XDoc.Load(textReader);
XmlDocumentType XDType = XDoc.DocumentType;
XDoc.RemoveChild(XDType);

using (XmlReader xmlReader = new XmlTextReader(XDoc)) {
                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;
            }

不要使用
XmlTextReader
,而是调用并传递一个
XmlReaderSettings
对象,设置为:

注意:在.NET 4.0中添加了
DtdProcessing
属性。在.NET 3.5中,您可以改为设置为
false
null

var settings = new XmlReaderSettings { ProhibitDtd = false, XmlResolver = null };

完美的这很有魅力。我很害怕必须去掉标签(感觉太像黑客了)。去看看这个链接,它对我有用。
TextReader textReader = new StringReader( message );
var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore };

using (XmlReader xmlReader = XmlReader.Create(textReader, settings))
var settings = new XmlReaderSettings { ProhibitDtd = false, XmlResolver = null };