0

我需要解析一个复杂的大型 (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?

4

1 回答 1

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();
于 2013-01-15T06:50:53.677 回答