私はこれに髪を引っ張っています。私は XmlReader を使用して手動で逆シリアル化を行います - 深刻なことは何もありません。しかし、これは私が理解できないものです。
これはサンプルの xml ファイルです
<?xml version="1.0" encoding="utf-8"?>
<Theme name="something" version="1.0.0.0">
<Thumbnail length="1102">[some base64 encoded data]
</Thumbnail>
<Backgrounds>
<string>Themes\something\Backgrounds\file1</string>
<string>Themes\something\Backgrounds\file2</string>
<string>Themes\something\Backgrounds\file3</string>
</Backgrounds>
<Stickers>
<string>Themes\something\Stickers\stick1</string>
<string>Themes\something\Stickers\stick1</string>
<string>Themes\something\Stickers\stick1</string>
</Stickers>
<PreviewImages>
<string>Themes\something\Preview\rh_01.jpg</string>
<string>Themes\something\Preview\rh_02.jpg</string>
<string>Themes\something\Preview\rh_03.jpg</string>
</PreviewImages>
</Theme>
これは逆シリアル化コードです (少し簡略化されています):
public void ReadXml(System.Xml.XmlReader reader)
{
/* Read attributes - not important here */
while (reader.Read())
{
Console.WriteLine("Main: {0} {1}", reader.NodeType, reader.Name);
switch (reader.Name)
{
case Xml.Elements.Thumbnail:
this._thumbnail = Xml.DeserializeBitmap(reader);
Console.WriteLine("Inner: {0} {1}", reader.NodeType, reader.Name);
break;
case Xml.Elements.Backgrounds:
this._backgrounds = Xml.DeserializeListOfStrings(reader);
break;
case Xml.Elements.Stickers:
this._stickers = Xml.DeserializeListOfStrings(reader);
break;
case Xml.Elements.PreviewImages:
this._previewImages = Xml.DeserializeListOfStrings(reader);
break;
}
if (reader.NodeType == System.Xml.XmlNodeType.EndElement
&& reader.Name == Xml.Root)
break;
}
}
問題:
this._thumbnail
が逆シリアル化された後、 はThumbnailノードreader
の終了要素に配置されます。次に、ループの先頭で...が呼び出され、文字列ノードの開始要素に配置されます。Backgrounds要素はスキップされます。なんで?reader.Read()
while
reader
これは、 が で、そのプロパティが または に設定されている場合reader
にXmlTextReader
発生WhitespaceHandling
しWhitespaceHandling.None
ますWhitespaceHandling.Significant
。
WhitespaceHandling.All
すべてに設定されている場合は、期待どおりに機能します。を呼び出しreader.Read()
た後、 Backgroundsノードreader
の開始要素に配置されます。
[編集]サンプル コードに 2 つのデバッグ行を追加しました。
私はこれWhitespaceHandling.All
を得る:
Main: Whitespace
Main: Element Thumbnail
Inner: EndElement Thumbnail
Main: Element Backgrounds
Main: Whitespace
Main: Element Stickers
Main: Whitespace
Main: Element PreviewImages
Main: Whitespace
Main: EndElement Theme
私はこれWhitespaceHandling.Significant
を得る:
Main: Element Thumbnail
Inner: EndElement Thumbnail
Main: Element string
Main: Text
Main: EndElement string
Main: Element string
Main: Text
Main: EndElement string
Main: Element string
Main: Text
Main: EndElement string
Main: EndElement Backgrounds
[編集 2]デバッグ出力を少し読みやすく調整しました。
ご覧のとおり、 のデバッグ出力は でWhitespaceHandling.Significant
終了し</Backgrounds>
ます。これXml.DeserializeListOfStrings
は、ドキュメントが正しく配置されているかどうかをまだ確認しておらず、「誤って」ドキュメントを最後まで読み取っているためです。しかし、それはこの質問の範囲ではありません。