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

时间:2017-05-31 12:17:14

标签: c# xml xml-parsing xmlreader

我正在尝试读取XML文件的内容并将其存储在各种列表中,但是,我一直遇到麻烦的是尝试读取不是最内层子节点的兄弟节点(兄弟姐妹1-4和tableName)下文)。

<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();

1 个答案:

答案 0 :(得分: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}'");
        }
    }
}