2016-07-28 108 views
2

例如,我有以下类型的条件:如何检查是否一个元素标签是结束元素

if (reader.IsStartElement("element1")) 
{ 
    while (true) 
    { 
     if (reader.IsStartElement("element2")) 
     { 
      // Doing stuff 
      reader.ReadEndElement(); //closes element2 tag 
     } 
     else if (reader.IsStartElement("element3")) 
     { 
      // Doing stuff 
      reader.ReadEndElement(); //closes element3 tag 
     } 
     else if ((!reader.IsStartElement("element2")) 
       && (!reader.IsStartElement("element3")) 
       && (!reader.IsEndElement("element1"))) // THIS IS MY ISSUE 
     { 
      throw new XmlException("exception"); 
     } 
     else 
     { 
      reader.ReadEndElement(); //closes element1 tag 
     }  
    } 
} 

我的XML是写在下面的格式类型:

<element1> 
    <element2> 
    </element2> 
    <element3> 
    </element3> 
</element1> 

什么我想要做的是说,如果element1中有一个元素不是element2element3而且不是element1的结束元素标记,则会抛出我写入的异常。问题是没有办法检查我能找到的XmlReader的结束元素标记。我可以检查reader.IsStartElement但不是reader.IsEndElement。有另一种方法可以检查类型是否是最终元素?

+1

有更好的方法与XMLReader可以读取XML验证它的结束标记部件1。看到我的代码在下面张贴:http://stackoverflow.com/questions/34274568/how-to-read-an-xml-file-by-using-xmlreader-in-c-sharp – jdweng

回答

3

您可以检查节点类型,然后使用reader.Name

if (reader.NodeType == XmlNodeType.EndElement) 
{ 
    if(reader.Name == "element1") 
    { 
     //it's element1 end tag 
    } 
    else 
    { 
     //it's the end tag for something else 
    } 
} 
+0

有道理。是否在这种情况下,如果((!!reader.IsStartElement(“element2”)) &&(!reader.IsStartElement(“element3”)) &&(!reader.Name!=“element1”))工作还是一个坏主意?因为在这种情况下,我想我不需要验证它不是结束元素,如果我可以验证读者不是结尾元素的名称,如果这很有意义 – Tim

+0

我认为这将起作用。 –

+0

很酷。只是好奇。感谢您的提示 – Tim

2

您应该使用reader.Read()来移动XML,并看看读者的NodeType

枚举XmlNodeType包含ElementEndElement的值。

+0

我需要使用阅读器。在每个条件之后读()以便能够移过该元素并继续下一个? – Tim

+0

另外,当我尝试这个它会抛出一个错误,说我不能使用!运算符与XmlNodeType。我需要确定我正在查看的元素标记不是element1的结束标记... – Tim

+0

您应该最有可能在'while()'条件中使用'.Read()',而不是使用无限循环。请参阅我链接到的页面中的示例。为了比较枚举值,可以使用'!=':'reader.NodeType!= XmlNodeType.EndElement'。 – JLRishe

相关问题