4

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>

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;
            }
        }
}

xsd.exeを使用してオブジェクトを生成しました。

<!DOCTYPE>タグを削除すると、正常に逆シリアル化されます。

<!DOCTYPE>XmlSerializerにタグを無視させる方法はありますか?

XmlSerializerを渡す前にそれを取り除くことができることは知っていますが、必要がなければ、そのレベルのXML操作には行きたくありません。

4

3 に答える 3

6

を使用する代わりに、次のように設定されたオブジェクトをXmlTextReader呼び出しXmlReader.Createて渡します。XmlReaderSettingsDtdProcessingIgnore

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

using (XmlReader xmlReader = XmlReader.Create(textReader, settings))

注:このDtdProcessingプロパティは .NET 4.0 で追加されました。ProhibitDtd.NET 3.5 では、代わりにfalseXmlResolvernull次のように設定できます。

var settings = new XmlReaderSettings { ProhibitDtd = false, XmlResolver = null };
于 2013-01-21T22:21:38.950 に答える
0

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;
            }
于 2013-01-21T22:11:45.790 に答える
0

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();
}

次に、ドキュメントが逆シリアル化されたら、それを元に戻します。

于 2013-01-21T22:06:10.900 に答える