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