比xsd生成的类更快的XML文件读取

时间:2011-12-02 21:49:16

标签: c# .net xml performance

我正在处理大量包含HL7信息的XML文件。

这些XML文件的结构在几个复杂的XSD文件中描述。它们是XSD文件的层次结构。像这样:

  • Messages.xsd
    • batch.xsd
    • datatypes.xsd
      • Fields.xsd
    • MoreFiles.xsd
      • Fields.xsd

这不是确切的用法,但它有助于传达它们如何运作的想法。

现在我可以运行

  

xsd。\ messages.xsd / classes

并生成一个名为messages.cs的文件,该文件长度超过240,000行。

注意:尽管XSD很复杂,但实际的xml文件平均大约有250行XML,每行约25个字符(不是很大)。

我可以使用该文件反序列化我的xml文件,如下所示:

var bytes = Encoding.ASCII.GetBytes(message.Message);
var memoryStream = new MemoryStream(bytes);
var message = ormSerializer.Deserialize(memoryStream); 

这一切都很有效。

当需要从xml结构中提取数据时,太慢

有没有其他方法可以更快地访问我的xml数据?我应该使用XPathDocumentXPathNavigator吗? XPathNavigator可以使用所有XSD文件,因此我不必为我处理的每个xml文件重新创建它(并非所有XML节点都在所有XML文件中)吗?

快速获取XML数据的其他想法吗?

2 个答案:

答案 0 :(得分:1)

您正在使用的技术(将XML自动映射到Java或C#类)称为“数据绑定”,当架构简单且小巧时,它可以很好地工作。对于像HL7这样大而丑的东西,我会说这是一个非首发。

你在做什么样的处理?你有什么理由不能在XSLT或XQuery中做到这一点吗?这些语言旨在处理XML,它们可以避免在必须将数据从XML模型转换为Java或C#等编程语言的数据模型时出现的“阻塞不匹配”。

答案 1 :(得分:0)

你看过像XStreamingReader这样的东西吗?它允许您在流式传输大型XML文档时使用Linq to XML。我过去看了这个,并且能够流式传输XML,识别XML块并将它们反序列化为对象。如果你搞砸了这个并需要例子,我可以挖掘代码。

http://xstreamingreader.codeplex.com/