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