0

私の.netコードでは、Xml形式でデータを提供するサードパーティのasmxサービスを利用しています。したがって、基本的に、私はXmlNodeの形式で構造を受け取ります。

<PostcodeEntry>
    <Postcode>13542</Postcode>
    <Postcodename>Odessa</Postcodename>
</PostcodeEntry>

現在、POCOオブジェクトにマップするには、対応するChildNodeを手動で反復処理し、InnerText値を取得して、実際のデータを取得する必要があります。

 var PostCodeNode = entryNode.SelectSingleNode("Postcode");
 if (PostCodeNode != null)
 {
      result.PostCode = PostCodeNode.InnerText;
 }

大きな情報構造をマッピングする必要がある場合、コードは厄介なコードスクロールに成長します。

これを改善して、手動で解析を記述する必要がないようにする方法はありますか?このためのベストプラクティスは何ですか?

4

2 に答える 2

1

データの取得方法やコードの設計方法などに応じて、さまざまなオプションがあると思います。簡単な説明から、少なくとも次の2つを考えることができます。

  • XMLシリアライザーを作成します。たとえば、クラスをXml属性でマークアップし、シリアライザーを介してXMLを目的のオブジェクトとして直接逆シリアル化します。このアプローチの欠点は、シリアライザーとビジネスオブジェクトの間に強力な結合が作成されることです。次のようなものを見てください:http ://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization 。

  • プロキシオブジェクトを作成し、プロキシオブジェクトをビジネスオブジェクトにマップします。プロキシオブジェクトは、asmxサービスによって公開されたWSDLを使用するか、XSD.exeツールなどを使用して作成できます(XMLがXSDによってまだ記述されていない場合は、最初にXMLに基づいてXSDを生成する必要があります)。 )。次に、プロキシオブジェクトのプロパティをビジネスオブジェクトのプロパティにマップできます。これにより、オブジェクト間の分離がより明確になりますが、同時に、より多くの作業が必要になります。

Br。モーテン

于 2012-11-17T16:08:01.830 に答える
0

WebServiceのSoapClientオブジェクトを作成してから、ResponseをList<>として返すことができます。Ouputの応答をList<>に変更する必要があります。

例これを消費するWebサービスをコンシルダーします。http://xxx.xx.xxx.xxx/CosmosService/Cm_Service.asmx

次に、アプリケーションにサービス参照を追加し、[詳細設定]ボタンをクリックして、コレクションタイプSystem.Collections.GenericListを変更します。

次に、このように直接WebServiceメソッドをList<>として使用できます。

CosmosRef.CM_ServiceSoapClient client = new CosmosRef.CM_ServiceSoapClient();

            List<CosmosRef.Product> listProduct = client.GetAllProducts("Computers", 1);
            dataGrid1.DataContext = listProduct;
于 2012-11-29T12:05:24.807 に答える