我试图尽快阅读下面的Xml文档,并让额外的类管理每个子块的读取。
<ApplicationPool> <Accounts> <Account> <NameOfKin></NameOfKin> <StatementsAvailable> <Statement></Statement> </StatementsAvailable> </Account> </Accounts> </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稍微调整):
static IEnumerable<XElement> SimpleStreamAxis(string inputUrl,string elementName) { using (XmlReader reader = XmlReader.Create(inputUrl)) { reader.MoveToContent(); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name == elementName) { XElement el = XNode.ReadFrom(reader) as XElement; if (el != null) { yield return el; } } } } } }
我使用这个将StackOverflow用户数据(这是巨大的)转换为另一种格式 – 它工作得很好。
编辑从雷达,重新格式化的Jon – 虽然不清楚哪个“读得太远”的问题被引用…
这应该简化嵌套和照顾“一个读得太远”的问题。
using (XmlReader reader = XmlReader.Create(inputUrl)) { reader.ReadStartElement("theRootElement"); while (reader.Name == "TheNodeIWant") { XElement el = (XElement) XNode.ReadFrom(reader); } reader.ReadEndElement(); }
这需要处理“读取太远”的问题,因为它实现了经典的while循环模式:
initial read; (while "we're not at the end") { do stuff; read; }