我可以使用XMLReader创建表示文档中元素的对象吗?

问题描述:

我有一个非常大的XML文件,我需要解析,所以我需要使用XMLReader。该文件包含了大量的包含我感兴趣的如信息,第二级元素:我可以使用XMLReader创建表示文档中元素的对象吗?

<topLevelElement> 
    <SecondLevelElement> 
    <Information1>blah</Information1> 
    <Information2>blah</Information2> 
    <Information3>blah</Information3> 
    </SecondLevelElement> 
    <SecondLevelElement> 
    .... 
</topLevelElement> 

个人第二级的元素不是很大,所以我很乐意单独装载每一个作为对象,并希望根据我试图解析的文件的架构来构造我的阅读器代码。

我用XSD.EXE创建从我的模式对象,并试图此:

while(lReader.Read()) 
{ 
    if (lReader.Name == "SecondLevelElement") 
    { 
    MyXml.SecondLevelElement lSecondLevelElement = lReader.ReadElementContentAs(typeof(MyXml.SecondLevelElement), null) as MyXml.SecondLevelElement; 

    if (lSecondLevelElement != null) 
    { 
     // Do stuff 
    } 
    } 
} 

但它失败了并不十分有益的例外ReadElementContentAs()。 MSDN中的示例只显示了用于非常基本的数据类型的这种方法,所以我不完全确定我甚至可以这样做。

所以我的第一个问题是,这甚至是可能的,还是我浪费我的时间完全错误的树?如果我错了,是否有解析XML部分的方法,而不构建我的阅读代码以紧密匹配XSD?

编辑 应用帕维尔的答案后,我得到了反序列化错误。在我的情况下,这是我用来自动生成类的XSD。因为我有整个文档的XSD,所以第二级元素类名称与实际元素名称不匹配。为了解决这个问题,我从我的XSD模式中删除了*元素并重新生成了这些类。完成之后,这一切都很完美。

ReadElementContentAs只适用于一组预定义的大多是原始类型像intDateTime等,这是不是与xsd.exe生成的类型可以使用 - 这些被处理XmlSerializer

private static readonly XmlSerializer secondLevelElementSerializer = 
    new XmlSerializer(typeof(MyXml.SecondLevelElement)); 
... 
XmlReader reader; 
while (reader.Read()) 
{ 
    ... 
    switch (reader.Name) 
    { 
     case "SecondLevelElement": 
      { 
       MyXml.SecondLevelElement elem = (MyXml.SecondLevelElement) 
         secondLevelElementSerializer.Deserialize(reader); 
       ... 
      } break; 
     ... 
    } 
} 
+0

工作就像一个魅力。 – Marcel 2014-04-30 07:28:54

如果XML的子块符合XSD,那么您肯定可以将它们转换为功能对象。我在这里很详细写一下:

http://blog.andrewsiemer.com/archive/2008/04/30/accepting-xmldocuments-from-biztalk-de-serializing-them-to-xsd-generated-serializable.aspx