使用XmlReader类读取XML

时间:2014-04-22 02:18:19

标签: c# .net xml xmlreader

我有一个XML文件,格式如下:

<Votes>
   <Candidate>
      <CandidateName>Boris Johnson</CandidateName>
   </Candidate>
   <Vote>
      <VoteString>1 3 6 2 9 7 4 5 8</VoteString>
   </Vote>
</Votes>

我想先阅读CandidateName,然后阅读VoteString。我使用以下代码:

using (XmlReader reader = XmlReader.Create(filepath))
{
   if (reader.IsStartElement())
   {
      switch (reader.Name)
      {
         case "Candidate":
         string name = reader["CandidateName"];
         break;

         case "Vote":
         string voteStr = reader["VoteString"];
         break;
      }
   }
}

调试中发生的事情是reader.Name设置为“Votes”,并且我的switch语句中的两个case永远不会被触发。我查看了XmlReader方法,找到列出所有元素但没有任何内容的东西。

之前我没有直接使用过XML文件,所以我不确定使用的XML格式是否正确。我是以正确的方式来做这件事吗?

2 个答案:

答案 0 :(得分:2)

XML阅读器将读取XML树中的每个元素,因此如果您还没有通过将阅读器置于循环中而无法点击您想要的节点,那么您只需要继续。您的代码需要继续循环遍历XML,因此需要看起来更像这样:

using (XmlReader reader = XmlReader.Create(filepath))
{
   while(reader.Read())
   {
      if (reader.IsStartElement())
      {
         switch (reader.Name)
         {
            case "Candidate":
            string name = reader["CandidateName"];
            break;

            case "Vote":
            string voteStr = reader["VoteString"];
            break;
         }
      }
   }
}

当然,这里更重要的问题是你想要用你所获得的那些价值做些什么?您当前的代码实际上并没有对这些值执行任何操作,除非将它们分配给超出范围的变量。

答案 1 :(得分:1)

XmlReader适用于快速,前向读取操作。您可以通过阅读,跳过以及阅读器公开的一系列其他方法(一个循环)向前移动阅读器来完成您想要做的事情。或者,您可以切换到XmlDocument并按名称,ID,xpath等选择节点。

的XmlReader: 而(reader.Read()) {    ... }

的XmlDocument: XmlDocument doc = new XmlDocument(); doc.Load(文件路径);

var nodes = doc.GetELementsByTagName(“CandidateName”); nodes = doc.GetElementsByTagName(“投票”);