阅读Xml与XmlReader在C#

前端之家收集整理的这篇文章主要介绍了阅读Xml与XmlReader在C#前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图尽快阅读下面的Xml文档,并让额外的类管理每个子块的读取。
  1. <ApplicationPool>
  2. <Accounts>
  3. <Account>
  4. <NameOfKin></NameOfKin>
  5. <StatementsAvailable>
  6. <Statement></Statement>
  7. </StatementsAvailable>
  8. </Account>
  9. </Accounts>
  10. </ApplicationPool>

但是,我试图使用XmlReader对象来读取每个帐户,然后读取“StatementsAvailable”。你建议使用XmlReader.Read并检查每个元素并处理吗?

我想到分离我的类正确处理每个节点。因此,一个AccountBase类接受一个XmlReader实例,读取NameOfKin和其他几个关于帐户的属性。然后,我想通过语句交互,让另一个类填充自己的声明(随后添加到IList)。

到目前为止,我有“每类”部分通过做XmlReader.ReadElementString()完成,但我不能锻炼如何告诉指针移动到StatementsAvailable元素,让我迭代通过他们,让另一个类读取每个proeprties 。

听起来很容易!

我的XmlReader的经验是,它很容易意外阅读太多。我知道你说你想尽快阅读它,但你有没有尝试过使用DOM模型?我发现LINQ到XML使XML工作更容易。

如果您的文档特别巨大,您可以将XmlReader和LINQ与XML结合,以流式方式为每个“外部”元素从XmlReader创建一个XElement:这允许您以LINQ到XML进行大部分转换工作,但是仍然只需要在存储器中的文档的一小部分在任何一个时间。这里有一些示例代码(从this blog post稍微调整):

  1. static IEnumerable<XElement> SimpleStreamAxis(string inputUrl,string elementName)
  2. {
  3. using (XmlReader reader = XmlReader.Create(inputUrl))
  4. {
  5. reader.MoveToContent();
  6. while (reader.Read())
  7. {
  8. if (reader.NodeType == XmlNodeType.Element)
  9. {
  10. if (reader.Name == elementName)
  11. {
  12. XElement el = XNode.ReadFrom(reader) as XElement;
  13. if (el != null)
  14. {
  15. yield return el;
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }

我使用这个将StackOverflow用户数据(这是巨大的)转换为另一种格式 – 它工作得很好。

编辑从雷达,重新格式化的Jon – 虽然不清楚哪个“读得太远”的问题被引用…

这应该简化嵌套和照顾“一个读得太远”的问题。

  1. using (XmlReader reader = XmlReader.Create(inputUrl))
  2. {
  3. reader.ReadStartElement("theRootElement");
  4.  
  5. while (reader.Name == "TheNodeIWant")
  6. {
  7. XElement el = (XElement) XNode.ReadFrom(reader);
  8. }
  9.  
  10. reader.ReadEndElement();
  11. }

这需要处理“读取太远”的问题,因为它实现了经典的while循环模式:

  1. initial read;
  2. (while "we're not at the end") {
  3. do stuff;
  4. read;
  5. }

猜你在找的XML相关文章