.net 使用XmlReader类阅读XML

toiithl6  于 2023-07-01  发布在  .NET
关注(0)|答案(2)|浏览(107)

我有一个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;
      }
   }
}

在debug中发生的情况是reader.Name被设置为“Votes”,并且switch语句中的两种情况永远不会被触发。我已经查看了XmlReader方法,以找到列出所有元素的东西,但什么也没有。
我以前没有直接处理过XML文件,所以我不确定使用的XML格式是否正确。我这样做对吗

xa9qqrwz

xa9qqrwz1#

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;
         }
      }
   }
}

当然,这里更重要的问题是,你试图用你得到的这些值做什么?您当前的代码实际上并没有对这些值做任何事情,只是将它们赋给一个立即超出范围的变量。

r3i60tvu

r3i60tvu2#

XmlReader适用于快速、向前读取操作。您可以通过在循环中使用Read、Skip和由读取器公开的一大堆其他方法来向前移动读取器来完成您想要做的事情。或者,您可以切换到XmlDocument并按名称、id、xpath等选择节点。
XmlReader:while(reader.Read()){ ...}
XmlDocument:String getString = new String(); doc.Load(filepath);
var nodes = doc.GetElementsByTagName(“CandidateName”); public String s = doc.getElementsByTagName();

相关问题