【问题标题】:Programatically filter XML in a streaming fashion (XmlWrappingReader/Writer alternatives?)以流方式以编程方式过滤 XML(Xml Wrapping Reader/Writer 替代方案?)
【发布时间】:2012-01-25 01:46:22
【问题描述】:

我正在使用一些 .NET 服务,这些服务有可能处理非常大的 XML 文档,我需要确保所有处理都以流/流水线方式完成。我已经在使用XmlReaderXmlWriter 类。我的问题是,以编程方式向读者和作者提供过滤器的最佳方式是什么(取决于流程)?

(我不是在寻找 XSLT。我已经用 XSLT 做了很多事情,而且我想做的很多事情都超出了 XSLT 的范围——或者至少,在 XSLT 中实现并不理想。)

在 Java 和 SAX 中,这最好通过 XMLFilterImpl 处理。我没有看到 .NET 为使用 XmlReader 提供了任何类似的功能。我确实找到了this blog post, "On creating custom XmlReaders/XmlWriters in .NET 2.0, Part 2",其中包括以下内容(我已经修复了原始帖子中断开链接的第一个链接):

这是一个想法 - 有一个实用程序包装类,它包装 XmlReader/XmlWriter 并且什么都不做。然后从这个类派生 并覆盖您感兴趣的方法。这些实用程序包装器是 称为 XmlWrapingReader 和 XmlWrapingWriter。他们是一部分 System.Xml 命名空间,但不幸的是它们是内部命名空间 - Microsoft XML 团队 has considered making them public,但在 Whidbey release rush决定推迟这个问题。好的,很高兴这些 作为纯包装器的类没有任何逻辑,所以任何人 需要它们确实可以在 10 分钟内创建它们。但是为了救你 那 10 分钟我把这些包装贴在这里。我将包括 XmlWrapingReader 和 XmlWrapingWriter 进入下一个Mvp.Xml library 释放。

Mvp.Xml 库中的这两个类(XmlWrappingReaderXmlWrappingWriter)目前很好地满足了我的需求。 (作为一个额外的奖励,它是一个免费的开源库,BSD 许可。)然而,由于这个项目的陈旧状态,我确实有些担心将这些类包含在一个合同的商业开发项目中,该项目将被移交。 Mvp.Xml 的最后一次发布是 4.5 年前的 2007 年 7 月。此外,还有一位“项目协调员”回复this project discussion 的评论:

无论如何,这不再是一个真正受支持的项目。所有开发者都搬家了 出去。但它是开源的,你自己做。

我也找到了SAX equivalent in .Net,但SAXDotNet 的状态似乎没有任何好转——它的最后一个版本是在 2006 年。

我很清楚,陈旧的项目并不一定意味着它的可用性降低,并且将继续使用 Mvp.Xml 库中的 2 个包装类 - 至少现在是这样。

有没有更好的选择我应该考虑? (同样,任何解决方案都不得要求整个 XML 在任何时候都存在于内存中 - 无论是作为 DOM、字符串还是其他形式。)是否有其他可用的库(最好是来自更活跃项目的库),或者也许LINQ功能中的某些东西可以满足这些要求?

【问题讨论】:

    标签: c# .net xml c#-4.0 sax


    【解决方案1】:

    我个人发现使用推送模型编写过滤器管道比使用拉取模型效果更好,尽管两者都是可能的。使用拉模型,需要生成多个输出事件以响应单个输入事件的过滤器的编程非常棘手,尽管当然可以通过跟踪状态来完成。所以我认为寻找类似 SAX 的方法是有道理的。

    我会再看一下 SaxDotNet 或等价物。准备好查看源代码并根据您的需要进行修改;考虑回馈您的改进。本质上,它所做的工作非常简单:从(拉)输入读取事件并将事件写入(推)输出的循环。事实上,它是如此简单,也许它自 2006 年以来一直没有改变的原因是它不需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 2017-01-17
      • 1970-01-01
      相关资源
      最近更新 更多