2009-09-14 27 views
1

如果我跳过,是否还需要读取结束元素?XmlReader.Skip - 需要读取跳过的结尾元素?

  reader.ReadStartElement("ENCODING"); 
      reader.Skip(); 
      reader.ReadEndElement(); 

而我不明白我们什么时候需要ReadEndElement。例如,我们在一些课堂上已经得到了,完全没有使用它。例如:

 using (reader) 
     { 
      reader.Read(); 
      reader.ReadStartElement("Envelope"); 
      reader.ReadStartElement("Body"); 
      reader.ReadStartElement("RESULT"); 
      reader.ReadStartElement("SUCCESS"); 
      _success = reader.ReadString(); 
      if (!Success) 
      { 
       if (SomeUtil.ReadUntilElement(reader, "FaultString")) 
       { 
        string _errorMessage = reader.ReadString(); 
        InvalidOperationException ex = new InvalidOperationException(_errorMessage); 

        throw ex; 
       } 
       else 
        throw new InvalidOperationException("Invalid Error Message"); 
      } 
     } 

回答

1

您需要将调用ReadStartElement的次数与调用ReadEndElement的次数相匹配。当你处于最后一个元素时,它可能在某些情况下起作用,但通常不推荐。

+0

我的老板说我们根本不需要它们!它的工作原理!我开始配合他们,然后他说我们不需要所有的人。跆拳道。所以这就是为什么我问,因为我不明白为什么它没有他们会工作,但它确实如此。 – PositiveGuy 2009-09-14 19:34:13

1

你可以粗略地执行以下操作跳过当前元素:

 int depth = reader.Depth; 
     while (!reader.EOF && (reader.Depth > depth || reader.NodeType == XmlNodeType.EndElement)) 
      reader.Read(); 

通过捕捉和比较的读者,我们可以肯定,我们发现当前元素的匹配密切的深度。

+0

这是个好主意。然而,我不确定代码是否正确,因为如果您尝试跳过的元素的EndElement后面跟着更多的结束元素,那么这也会跳过所有这些元素。 因此,对于对称性,我所做的是在开始解析可能存在问题的子树之前,我记录了初始深度。然后我尝试着解决。如果发生异常,我在执行 while(!reader.EOF && reader.Depth> currentNodeDepth) { reader.Read(); } – 2011-05-19 09:40:16

+0

它可以在不读取它的情况下将所有内容带到最后的元素。然后,作为一个完整性检查,我在调用reader.ReadEndElement之前检查reader.Name是我期望的元素。 – 2011-05-19 09:45:01