C# 当WhitespaceHandling设置为“无”或“重要”时,XmlTextReader跳过节点的原因
我对这件事非常生气。我使用XmlReader进行了一些手动反序列化-没什么大不了的,做了很多次。但这是我搞不懂的 这是示例xml文件C# 当WhitespaceHandling设置为“无”或“重要”时,XmlTextReader跳过节点的原因,c#,xml-serialization,.net-2.0,C#,Xml Serialization,.net 2.0,我对这件事非常生气。我使用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> <Back
<?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>
问题是:
在此之后。\ U缩略图被反序列化,读取器定位在缩略图节点的关闭元素上。然后reader.Read在while循环的开头被称为。。。读取器定位在字符串节点的起始元素上。背景元素被跳过!为什么?
当读卡器是XmlTextReader且其WhitespaceHandling属性设置为WhitespaceHandling.None或WhitespaceHandling.Impressive时,会发生这种情况
如果设置为WhitespaceHandling,则所有操作均按预期进行。调用reader.Read后,读取器位于Backgrounds节点的起始元素上
[编辑]我在示例代码中添加了两行调试代码
使用空格处理。我得到的是:
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
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
使用空格处理。我明白了这一点:
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
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.signitive的调试输出结束于。这是因为我的Xml.DeserializeListOfStrings尚未检查其位置是否正确,并意外地将文档读取到底。但这不是问题的范围。我头痛的原因是我用来反序列化节点的XmlReader.ReadElementContentAsBase64方法。我在一个循环中进行试验:
private static byte[] ReadBytes(System.Xml.XmlReader reader)
{
byte[] buffer = new byte[128];
int length = XmlConvert.ToInt32(reader[Xml.Attributes.Length]);
using (MemoryStream ms = new MemoryStream(length))
{
int count = 0;
do
{
count = reader.ReadElementContentAsBase64(buffer, 0, buffer.Length);
ms.Write(buffer, 0, count);
} while (ms.Length < length);
return ms.GetBuffer();
}
}
也可以使用XmlTextReader.ReadBase64方法一次读取整个元素内容,但我被迫只使用XmlReader base,因为我的类实现了IXmlSerializable,所以这个方法对我不可用。对于WhitespaceHandling来说很奇怪。所有,由于XML中有一个换行符,所以内部:EndElement缩略图和主:元素背景之间没有Main:空白行。