如何在使用C#计算没有内容的元素时,如何从XML(带有后代)中读取同级元素的内容?

问题描述:

我想读取一个XML文件的内容并将其存储在各种列表中,但是,在我一直遇到麻烦的地方是试图读取不是最内层子节点的兄弟节点(兄弟姐妹1-4和下面的tableName )。如何在使用C#计算没有内容的元素时,如何从XML(带有后代)中读取同级元素的内容?

<Parent parent="1"> 
    <sibling1>256</sibling1> 
    <sibling2>1000</sibling2> 
    <sibling3>25</sibling3> 
    <sibling4 id="1"> 
    <tableName></tableName> 
    <table id="0"> 
     <row id="0"> 
     <child1></child1> 
     <child2>0</child2> 
     <child3>default</child3> 
     </row> 
    </sibling4> 
</Parent> 

我不能使用ReadElementContentAs因为他们有后代,我发现了一种围绕它的代码,但我仍然会碰到麻烦,如果我遇到了(以上如表名)没有内容的元素。如果元素没有内容(并且它可以或不可以有内容),我的代码解决方案(下面的tableName示例)不起作用,程序崩溃,因为它正在寻找错误类型的节点。是否有更简单的方式来访问这些兄弟姐妹的内容,或者说明元素可能没有内容的事实?我是XML新手,所以我不确定所有不同的方法。谢谢!

// tableName - WILL NOT WORK IF TABLE NAME IS LEFT BLANK (MUST HAVE DEFAULT) 
xmlIn.ReadToDescendant("tableName"); 
xmlIn.Read(); 
List.tableName = xmlIn.Value; 
xmlIn.Read(); 
xmlIn.ReadEndElement(); 
+0

举一个你想获得什么数据的例子。 –

您必须先检查节点的类型,然后再阅读或移动节点。

while (reader.Read()) 
{ 
    if (reader.NodeType == XmlNodeType.Element && reader.LocalName.StartsWith("sibling")) 
    { 
     Console.Write(reader.LocalName + ": "); 
     reader.Read(); 

     if (reader.NodeType == XmlNodeType.Text) 
      Console.WriteLine(reader.ReadContentAsString()); 
     else 
     { 
      reader.ReadToFollowing("tableName"); 
      Console.Write(reader.LocalName + ": "); 
      var tableName = reader.ReadElementContentAsString(); 
      Console.WriteLine($"'{tableName}'"); 
     } 
    } 
}