如何正确循环XmlTextReader(C#)?

如何正确循环XmlTextReader(C#)?,c#,xml,xmltextreader,C#,Xml,Xmltextreader,下面是我试图处理的XML文件类型的示例。如果我只有一个部件和一个伴随的数字/字符,我可以处理数据提取,而不需要“If(!reader.EOF)”控制结构。然而,当我尝试包含此结构以便可以循环检查另一部分、数字和字符组时,它会死锁 关于如何正确操作,有什么建议吗?这是我脑海中闪现的最有效的想法。我不熟悉从XML读取数据 示例Xml: <?xml version="1.0" encoding="UTF-8"?> <note> <part>100B</pa

下面是我试图处理的XML文件类型的示例。如果我只有一个部件和一个伴随的数字/字符,我可以处理数据提取,而不需要“If(!reader.EOF)”控制结构。然而,当我尝试包含此结构以便可以循环检查另一部分、数字和字符组时,它会死锁

关于如何正确操作,有什么建议吗?这是我脑海中闪现的最有效的想法。我不熟悉从XML读取数据

示例Xml:

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <part>100B</part>
  <number>45</number>
  <character>a</character>

  <part>100C</part>
  <number>55</number>
  <character>b</character>
</note>

XmlReader
类有许多有用的方法。使用它

见此:

var sb = new StringBuilder();

using (var reader = XmlReader.Create("test.xml"))
{
    while (reader.ReadToFollowing("part"))
    {
        var part = reader.ReadElementContentAsString();
        sb.Append("Part: ").AppendLine(part);

        reader.ReadToFollowing("number");
        var number = reader.ReadElementContentAsDouble();
        sb.Append("Number: ").Append(number).AppendLine();

        reader.ReadToFollowing("character");
        var character = reader.ReadElementContentAsString();
        sb.Append("Character: ").AppendLine(character);
    }
}

Console.WriteLine(sb);

Alexander的回答很好,根据Jon Skeet的评论,我只想使用XDocument添加样本:

var sb = new StringBuilder();
var note = XDocument.Load("test.xml").Root.Descendants();            
foreach (var el in note)
{                
    sb.Append(el.Name).Append(": ").AppendLine(el.Value);               
}
Console.WriteLine(sb);

例如,您有什么理由希望使用这种方法而不是将其加载到
XDocument
XmlReader
是一种非常低级的方法。如果您的XML无法放入内存,这会很有帮助,但否则我通常会使用更高级别的抽象。@JonSkeet刚刚查找了XDocuments,它们似乎表示XML文档。不确定这是如何更好。我只想解析显示的数据。XDOC是否提供了一种更有效的方法来完成我正在尝试的工作?我也不反对重新配置我正在使用的原语格式。正如我所说,我对XMLs是新手。因此,这是谷歌为我提供的第一个*(或第一个)格式。它们提供了一种更简单的方式来完成你想要做的事情。这样会更好,因为您的代码会更简单
XmlReader
在计算效率上可能更高,但我个人倾向于使用简单的代码,除非您有具体的性能目标。@JonSkeet感谢您的建议。就目前而言,Alexanders的例子正是我想要的。@JonSkeet请参见op!我想我应该更新这个帖子,而不是写一篇新帖子。如果这更合适,请通知。谢谢好心的先生!完美。请看op!我想我应该更新这个帖子,而不是写一篇新帖子。如果这更合适,请通知。@jth-问一个新问题。这就回到了它原来的状态。
var sb = new StringBuilder();
var note = XDocument.Load("test.xml").Root.Descendants();            
foreach (var el in note)
{                
    sb.Append(el.Name).Append(": ").AppendLine(el.Value);               
}
Console.WriteLine(sb);