0

如何有效地从大型 XML 文件中获取 XML 节点?

目前我有这段代码来加载 XML 文件并获取 NodeList。当该文件很小(仅包含该节点)时,这工作正常。但是,当我将它与另一个 XML 文件合并时,加载新的整个文件会使我的 Windows Mobile 设备崩溃(内存不足)

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(configFile);
XmlNodeList nodeList = xmlDocument.GetElementsByTagName("appsettings");

我的 XML 看起来像这样(我想获取appsettings哪些控件在我的应用程序中的按钮可见性):

<site>
<settings>
<appsettings>
<add key="0" type="Home" value="True"/>
<add key="1" type="About" value="False"/>
<add key="2" type="Contact" value="True"/>
</appsettings>
...........
</settings>
</site>

如何使用 XmlReader 搜索此节点并将其加载到nodeList?我试过用

4

2 回答 2

1

你应该使用一个XmlReader. 就像是:

using (var reader = XmlReader.Create("file://path/to/file"))
{
  reader.ReadToDescendant("appsettings");
  while (reader.Read() && reader.Name == "add")
  {
    yield return new
      {
        Key = reader.GetAttribute("key"),
        Type = reader.GetAttribute("type"),
        Value = reader.GetAttribute("value")
      };
  }
}
于 2013-10-25T18:01:38.243 回答
0

你试过LINQ to XML吗?(旧型号是 40 多岁:P)

也许是这样的:

var xmlDoc = XDocument.Load(@"E:\Xml.xml");
var query = xmlDoc.Root.Element("settings").Descendants().First();

我们知道“appsettings”节点总是驻留在特定的级别上。所以我们取根并查询设置节点。然后我们取那个节点的后代并取它的第一个。在当前情况下是“appsettings”。

我知道有一种 LINQ 方法可以让它变得更好,但这是我在没有 Visual Studio 或 LINQPad 的情况下能想到的。

希望这可以帮助。

于 2013-10-25T18:01:11.860 回答