6

次のコードを使用して XML ファイルを読み込もうとしています。

XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject));
StreamReader reader = new StreamReader(fileName);
object myobject = xmlSerializer.Deserialize(reader);

ファイルに次のようなコメントが含まれている場合:

<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2007 sp2  -->
<route>
    <!--File created on 26-Nov-2010 12:36:42-->
    <file_content>1
    <!--0 = type1 ; 1 = type2-->
    </file_content>
</route>

XmlSerializer は次のようなエラーを返します

予期しないノード タイプのコメントです。ReadElementString メソッドは、単純なコンテンツまたは空のコンテンツを持つ要素でのみ呼び出すことができます

ファイル内のこのコメントを削除すると、正常に動作します。

どこに問題があるのか​​ わかりません。アイデアはありますか?

4

3 に答える 3

6

ご覧のとおり、シリアル化された XML ではコメントは許可されていませんが、これは問題になりません。ソース XML を制御することはできませんが、逆シリアル化プロセスを制御するため、逆シリアル化の前にすべてのコメントを削除するだけです。

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(myobject));

    // load document
    XmlDocument doc = new XmlDocument();
    doc.Load(filename);

    // remove all comments
    XmlNodeList l = doc.SelectNodes("//comment()");
    foreach (XmlNode node in l) node.ParentNode.RemoveChild(node);

    // store to memory stream and rewind
    MemoryStream ms = new MemoryStream();
    doc.Save(ms);
    ms.Seek(0, SeekOrigin.Begin);

    // deserialize using clean xml
    xmlSerializer.Deserialize(XmlReader.Create(ms));

オブジェクトが巨大で、それらの膨大な数を短いスパンでデシリアライズする場合、フレームワーク外の高速 Xpath リーダーを調査できます。

于 2011-02-07T09:22:30.040 に答える
3

@mmix に同意します。シリアル化する前にコメントを削除する必要があります。

コメントを削除する別の方法かもしれませんXmlReaderXmlReaderSettings

    public static T DeSerialize<T>(string filePath)
    {
        var x = new XmlSerializer(typeof (T));

        //Serilaize would fail if there are comments in the xml document
        var xmlReaderSettings = new XmlReaderSettings {IgnoreComments = true};
        var xmlReader = XmlReader.Create(filePath, xmlReaderSettings);

        return (T)x.Deserialize(xmlReader);
    }
于 2014-07-24T01:52:35.187 に答える
0

jacob aloysious問題に対する最もエレガントな答えを見つけます。関数を使用して RSS フィードを読み取る場合にもSystem.ServiceModel.SyndicationFeed.Load機能します。以下の例:

public SyndicationFeed GetFeed(String url)
{
    var request = (HttpWebRequest)WebRequest.Create(url);
    using (var response = request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    {
        Debug.Assert(responseStream != null, "responseStream != null");

        var xmlReaderSettings = new XmlReaderSettings { IgnoreComments = true };
        using (XmlReader xmlReader = XmlReader.Create(responseStream, xmlReaderSettings))
        {
            var feed = SyndicationFeed.Load(xmlReader);
            return feed;
        }
    }
}
于 2016-10-15T17:47:07.903 に答える