C#中的复杂XML解析

时间:2013-01-15 06:36:33

标签: c# xml xsd2code

我需要解析一个复杂的大型(100 MB +)XML文件。幸运的是我有XML Schema定义,但遗憾的是我无法使用xsd2code生成自动XML反序列化,因为在XML的顶层使用了抽象消息类型。 XML文件的结构如下:

<Head>  
    <Batch>   
        <Dog></Dog>   
        <Dog></Dog>  
    </Batch>  
</Head>

xsd定义批处理以包含抽象动物,而不是狗。 Xsd2Code可以使用正确的XML属性创建Dog类,但dog类位于另一个xsd文件中。 我试图将所有xsd粘贴在一起,但这无法解决这个问题。
有没有像Linq to XML或Xpath这样的好方法来遍历Batch中的元素并创建Dog实例而无需手动解析Dog?

1 个答案:

答案 0 :(得分:1)

  

有没有像Linq to XML或Xpath这样的好方法来遍历Batch中的元素并创建Dog实例而无需手动解析Dog?

这取决于“手动”的含义。我发现有一个模式是有用的,其中每个相关的类都有一个静态FromXElement工厂方法(或一个构造函数采用XElement),它提取相关的细节。使用LINQ to XML非常简单,例如

public static Dog FromXElement(XElement element)
{
    // Or whatever...
    return new Dog((string) element.Element("Name"),
                   (double) element.Element("Weight"));
}

然后你可以使用:

List<Dog> dogs = batch.Elements("Dog")
                      .Select(x => Dog.FromXElement(x))
                      .ToList();

(您可能可以使用Select(Dog.FromXElement)代替 - 这取决于您使用的C#版本。)

要批量处理所有动物,您可能需要以下内容:

private static readonly Dictionary<string, Func<XElement, Animal>> Factories =
    new Dictionary<string, Func<XElement, Animal>>
{
    { "Dog", Dog.FromXElement },
    { "Cat", Cat.FromXElement },
    // etc
}
...
List<Animal> animals = batch.Elements()
                            .Select(x => Factories[x.Name.LocalName](x))
                            .ToList();