我正在尝试尽可能快地阅读以下 Xml 文档,并让其他类管理每个子块的阅读。
<ApplicationPool>
<Accounts>
<Account>
<NameOfKin></NameOfKin>
<StatementsAvailable>
<Statement></Statement>
</StatementsAvailable>
</Account>
</Accounts>
</ApplicationPool>
但是,我正在尝试使用 XmlReader 对象来读取每个帐户以及随后的“StatementsAvailable”。您是否建议使用 XmlReader.Read 并检查每个元素并处理它?
我想过分开我的类来正确处理每个节点。所以有一个 AccountBase 类,它接受一个 XmlReader 实例,该实例读取 NameOfKin 和有关该帐户的其他几个属性。然后我想通过 Statements 进行交互,让另一个类自己填写关于 Statement 的内容(然后将其添加到 IList)。
到目前为止,我通过执行 XmlReader.ReadElementString() 完成了“每类”部分,但我无法锻炼如何告诉指针移动到 StatementsAvailable 元素,让我遍历它们并让另一个类读取每个属性.
听起来很简单!
最佳答案
我对XmlReader
的经验是,很容易不小心读多了。我知道你说过你想尽快阅读它,但你是否尝试过使用 DOM 模型?我发现 LINQ to XML 使 XML 的工作变得更加容易。
如果您的文档特别大,您可以将 XmlReader
和 LINQ to XML 结合起来,方法是从 XElement
以流式方式为每个“外部”元素创建一个 XmlReader
:这让您可以进行大部分 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 用户数据(这是巨大的)转换为另一种格式 - 它工作得很好。
来自radarbob的编辑,由乔恩重新格式化 - 虽然不太清楚哪个“读得太远”问题正在被提及......
这应该会简化嵌套并解决“读得太远”的问题。
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;
}
关于c# - 在 C# 中使用 XmlReader 读取 Xml,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2441673/