7

私はデータインスタンスのいくつかのXML表現を扱っています。.NETシリアル化を使用してオブジェクトを逆シリアル化していますが、XMLを表すクラスを作成する必要があるため、私の魂の何かが妨げられています...以下は私がやりたいことですが、構文かどうかはわかりません可能です:

次のことを考慮してください。

dim xmlObject = SomeXMLFunction() 'where some function returns an object/string representation of xml...

xmlObject.SomePropertyDefinedInTheXML = SomeFunction()

これを使ったアプローチについて何か提案はありますか?

4

4 に答える 4

4

移動してxsd.exeを取得します。スキーマ定義から適切なXMLシリアル化クラスを作成します。自動的!

于 2010-02-12T17:55:33.020 に答える
3

XML の定義 (つまり XSD) を制御する場合は、実際に XML を表すクラスを作成することをお勧めします (これらは DTO と呼ばれます)。コードに対して厳密に型指定されたクラスが提供され、手動でエラーが発生しやすい xml の解析を自分で行う必要なく、無料で逆シリアル化を取得できます。この場合、最初にクラスを記述します。

[DataContract]
public class Book
{
  [DataMember]
  public string Name {get;set;}

  [DataMember]
  public string Author {get;set;}
}
//Then you can use this code to serialize
var xml = DataContractSerializer.Instance.SerializeToString(
  new Book {Name="A", Artist="B"});

//which will give you something like:
<Book>
<Name>A</Name>
<Author>B</Author>
</Book>
//You can then [Deserialize][2] it back again with:
var book = DataContractDeserializer.Instance.Parse<Book>(xml);

SerializerクラスとDeserializerクラスへのリンクは次のとおりです。

WSDL または XSD がある場合は、wsdl.exe (または VS.NET でサービス参照を追加) または xsd.exe を使用して、@DavidSchmitt が提案したように dto クラスを生成できます。

または、利用可能な XSD がない場合は、XML を解析する別の簡単な方法としてXLinqを参照することをお勧めします。

于 2010-02-12T18:08:11.920 に答える
0

ダックタイピングで求めているのは緩いタイピングであり、少なくとも 3.5 バージョンまでは、.net は必ず静的タイピングです。

ただし、これらの種類の道をたどり、タイプ解放を行うと、 classical frameworks => prototyping frameworks=> duck typing.

js では、明らかにこれらのほとんどすべてを達成できますが、c# や vb.net では、型に関連する場合、古典的で官僚的であることに気付くでしょう。

実行時にこれらの型を大まかに作成できますが、処理時間がかかり、メモリに格納されるまでは非常に遅くなる可能性があります。

どうしても必要な場合は、2 つのパス (リフレクションを含む) があります。

  • プロパティ情報を使用して、おそらくプロパティ ホルダーになるこれらのクラスを作成し、型を作成してそこに挿入できます。アセンブリやモジュールなど、それらを配置する場所を作成する必要があります。そのための行動計画を考え、それが暗示するセキュリティの問題を心配しない限り、現在の方法からはほとんどまたはまったくサポートされません。

  • 最も困難な道をたどり、reflection.emit を使用して、CLR で型を直接作成することができます。これにより、非常に多くの利点が得られます。ただし、それを行うのは苦痛であることがわかります。

ダックタイピングは素晴らしいので、方法を見つけたら、ぜひ教えてください。そして、独立した勇敢な人々は賞賛されなければなりません。

頑張って

于 2010-02-12T19:16:07.997 に答える