2

非常に大きく複雑な XML ファイルがあり、すべての要素の値を、作成済みのオブジェクトに抽出したいと考えています。私は WCF DataContractSerializer とプレーンな XmlSerializer を試しましたが、どちらも非常に問題がありました。

上記のメソッドを使用して XML を解析し、オブジェクトに割り当てる以外に、誰かが上記を実現する最も簡単な方法をお勧めできますか?

私はXDocumentを使うことだけを考えていました。

私の最終的な目標は、オブジェクトから値を取得し、新しい XML にシリアル化することです。

ここに私の元の投稿 XML デシリアライゼーションからオブジェクトへのエラーがありました

4

4 に答える 4

4

私は通常、Microsoft の XML スキーマ定義ツール(XSD.EXE) を 2 つの手順で使用して、任意の XML ドキュメントから逆シリアル化できるクラスを生成します。

ステップ1:

xsd file.xml [/outputdir:directory]

XML ファイルに対応する XSD ファイルを生成します

ステップ2:

xsd file.xsd /classes [/namespace:namespace] [/outputdir:directory]

ステップ 1 で作成したスキーマを使用して逆シリアル化できるクラスを生成します。

そこから、オブジェクトをそのまま使用するか、オブジェクトのプロパティをクラスのプロパティにマップすることができます。

于 2013-01-24T21:28:14.180 に答える
0

XmlReader または_XmlTextReader

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx

http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx

XmlReader または XmlTextReader は XML 全体をメモリにロードしないため、このような大きな XML ファイルを解析するのに役立ちます。

于 2013-01-24T21:30:11.277 に答える
0

DataContractSerializer と XmlSerializer は、XML を既に持っているオブジェクトに水和することしかできません。つまり、タイプ X のオブジェクトで開始し、それをシリアル化し、次に逆シリアル化してタイプ X に戻した場合にのみ機能します。データは自分で。オブジェクト全体をシリアライズすると言ったことに注意してください。それは単なるデータを超えて、データが適合する構造と型を含みます。

これは明らかにシリアル化されたオブジェクトではないため、独自のオブジェクトを構築し、XDocument を使用してそれを分離するという正しい方向に進んでいます。

于 2013-01-24T21:24:34.727 に答える
0

私は、XmlSerializer クラスと、System.Xml.Serialization 名前空間の属性とクラスで常に大きな成功を収めてきました。

逆シリアル化またはオブジェクトへの読み込みが必要な複雑な XML データがある場合、私はいつも最初に別の方法をとっていました。つまり、まず .NET オブジェクトをインスタンス化してからシリアル化します。次に、.NET オブジェクトに属性をゆっくりと段階的に追加して、シリアル化する方法を制御します。とにかく、System.Xml.Serialization名前空間のクラスを使用すると、オブジェクトをシリアル化する方法を完全に制御できます。メンバー変数を属性または要素としてシリアル化できます。オブジェクトの配列をシリアル化でき、メンバー変数も無視できます。xml 要素の名前をメンバー変数名とは異なる名前に変更できます... つまり、非常に強力です。

しかし、とにかく、トリックは後ろに行くことです。最初に .NET オブジェクトを作成してから、XML へのシリアル化を少しずつ開始します。好きなように取得すると、自動的に非常に簡単に逆シリアル化できます。

したがって、カスタム型は次のようにシリアル化/逆シリアル化できます。

[Serializable]
    [XmlRoot(Namespace = "www.google.com",
     ElementName = "BuildServicOptions",
     DataType = "string",
     IsNullable = true)]
public class Options {...}

XML は次のようになります。

<BuildServiceOptions ....>
</BuildServiceOptions>

配列は次のようにシリアル化できます。

[XmlArray("EmailNotifications")]
[XmlArrayItem("email")]
public string[] EmailNotifications;

XML は次のようになります。

<EmailNotifications>
<email>Peter@foo.com</email>
<email>James@foo.com</email>
<email>John@foo.com</email>
</EmailNotifications>

メンバー変数は、次のように無視できます。

[XmlIgnore]
public string ServerProjectDir;

メンバー変数は属性としてシリアル化できます

[XmlAttribute("Name")]
public string ProjectName;

メンバー変数であるカスタム データ型がある場合は、簡単です。そのクラスにシリアル化属性を追加するだけです。実際、XML ファイルに書き出す必要のあるすべてのクラスは、クラス定義にも属性を持つ必要があります。

于 2013-01-24T21:47:36.847 に答える