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