我正在为此拔头发。我使用 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
反序列化后,位于缩略图节点reader
的关闭元素上。然后在循环的开头被调用......并且定位在字符串节点的起始元素上。背景元素被跳过!为什么?reader.Read()
while
reader
当reader
isXmlTextReader
并且它的WhitespaceHandling
属性设置为WhitespaceHandling.None
or时会发生这种情况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
[编辑 2]调整了调试输出,使其更具可读性。
如您所见,调试输出WhitespaceHandling.Significant
结束于</Backgrounds>
. 那是因为我Xml.DeserializeListOfStrings
还没有检查它是否定位正确并且“意外”将文档读取到最后。但这不是这个问题的范围。