Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当WhitespaceHandling设置为“无”或“重要”时,XmlTextReader跳过节点的原因_C#_Xml Serialization_.net 2.0 - Fatal编程技术网

C# 当WhitespaceHandling设置为“无”或“重要”时,XmlTextReader跳过节点的原因

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

我对这件事非常生气。我使用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>
问题是:

在此之后。\ 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:空白行。