0

我正在尝试通读 2.5GB XML 文件并删除某些节点,比如“CD”元素和“DVD”元素。目前我正在做这样的事情:

using (XmlReader reader = XmlReader.Create("file.xml"))
{
    DeleteElements(reader.ReadElements("CD"));
    DeleteElements(reader.ReadElements("DVD")); // reader returns 0 elements
}

注意:DeleteElements只是循环这些元素并将它们从文档中删除,但这对于这个问题的目的来说最不重要。

目前我发现没有检索到“DVD”元素。如果您以前使用过XmlReader这么多,我相信您可以在这里找出问题的原因:在阅读器读取“CD”节点的文档后,阅读器没有找到任何“DVD”元素,因为阅读器位于文档末尾。

考虑到 XML 文件的大小以及我要检索的元素数量,我无法将整个文档加载到内存中,因为您会得到一个OutOfMemoryException- 这意味着没有 XDocument 或 XPathDocument 优点。

有没有办法让 XmlReader 在读取文档时同时返回“CD”和“DVD”?最初加载文档非常耗时,所以我不想多次这样做。一些很棒的东西reader.ReadElements("DVD|CD")很甜

4

1 回答 1

2

XmlReader 是一个只向前的 xml 解析器。如果有一个 ReadElements 方法,它会将阅读器运行到最后,然后就没有更多的 DVD 元素了。所以你必须在你的文件上运行两次。

XmlReader的基本用法:

using (XmlReader reader = XmlReader.Create("input.xml")) {
  while (reader.Read()) {
    switch (reader.NodeType) {
    case XmlNodeType.Element:
      switch (reader.Name) {
      case "CD":
        // do something with a CD
        break;
      case "DVD":
        // do something with a DVD
        break;
      default:
        // do something with all other elements
        break;
      }
      break;
    }
  }
}

你在 DeleteElements 方法中做什么?您可能需要为新的临时文件创建一个 XmlWriter,然后将除要删除的元素之外的所有元素写入临时文件,并至少将原始文件替换为临时文件。

这样,您就可以对所有元素进行一个循环,包括删除(排除)一些元素。

于 2012-12-21T02:05:18.553 回答