0

複雑で大きな(100 MB以上)XMLファイルを解析する必要があります。幸い、XMLスキーマ定義がありますが、XMLの最上位で使用される抽象メッセージタイプがあるため、残念ながらxsd2codeを使用して自動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ファクトリ メソッド (または を受け取るコンストラクター)があるパターンがあると便利であることがわかりました。XElementLINQ 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 に答える