Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使用XMLReader创建表示文档中元素的对象吗?_C#_Xml_Xml Serialization - Fatal编程技术网

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

C# 我可以使用XMLReader创建表示文档中元素的对象吗?,c#,xml,xml-serialization,C#,Xml,Xml Serialization,我有一个非常大的XML文件需要解析,所以我需要使用XMLReader。此文件包含大量第二级元素,其中包含我感兴趣的信息,例如: <topLevelElement> <SecondLevelElement> <Information1>blah</Information1> <Information2>blah</Information2> <Information3>blah</

我有一个非常大的XML文件需要解析,所以我需要使用XMLReader。此文件包含大量第二级元素,其中包含我感兴趣的信息,例如:

<topLevelElement>
  <SecondLevelElement>
    <Information1>blah</Information1>
    <Information2>blah</Information2>
    <Information3>blah</Information3>
  </SecondLevelElement>
  <SecondLevelElement>
  ....
</topLevelElement>
但是它失败了,ReadElementContentAs()中出现了一个不太有用的异常。MSDN中的示例仅显示了在非常基本的数据类型上使用的这种方法,因此我甚至不能完全确定我是否能够做到这一点

所以我的第一个问题是,这是可能的,还是我把时间浪费在完全错误的树上了?如果我错了,是否有一种方法可以解析XML部分,而不必将我的阅读代码结构化为与XSD紧密匹配

编辑
应用Pavel的答案后,我得到了反序列化错误。在我的例子中,这取决于我用来自动生成类的XSD。因为整个文档都有XSD,所以第二级元素类名与实际元素名不匹配。为了解决这个问题,我从XSD模式中删除了顶层元素,并重新生成了类。如果XML的子块符合XSD,那么您当然可以将它们转换为函数对象。我在这里详细描述了这一点:


ReadElementContentAs
仅适用于一组预定义的基本类型,如
int
DateTime
等。它不能与
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;
        ...
    }
}  
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;
        ...
    }
}