我可以使用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
只适用于一组预定义的大多是原始类型像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;
...
}
}
答
如果XML的子块符合XSD,那么您肯定可以将它们转换为功能对象。我在这里很详细写一下:
工作就像一个魅力。 – Marcel 2014-04-30 07:28:54