我正在拉我的头发。我使用XmlReader进行一些手动反序列化 - 没有什么严重的,完成了zilion时间。但这是我无法弄清楚的。为什么在WhitespaceHandling设置为None或者显着时XmlTextReader跳过了节点
这是示例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
,所述reader
是定位于的关闭元素T humbnail节点。然后reader.Read()
在while
循环的开始处被调用...并且reader
被定位在的起始元素上字符串节点。 背景元素被跳过!为什么?
这种情况发生在reader
是XmlTextReader
,它的WhitespaceHandling
属性设置为WhitespaceHandling.None
或WhitespaceHandling.Significant
。
如果它设置为WhitespaceHandling.All
一切都按预期工作。在拨打reader.Read()
后,reader
定位在起始元素背景节点上。
[编辑]我已经添加了两个调试行于该示例的代码。
随着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
[EDIT 2]调整调试输出一个位是更具有可读性。
如您所见,WhitespaceHandling.Significant
的调试输出结尾为</Backgrounds>
。这是因为我的Xml.DeserializeListOfStrings
尚未检查它是否正确定位,并且“意外”将文档读取到最后。但这不是这个问题的范围。
对于'WhitespaceHandling.All',奇怪的是,在Inner:EndElement Thumbnail和Main:Element Backgrounds之间没有Main:Whitespace行,因为XML中存在换行符。 – 2012-04-05 21:48:39