0

この質問は、タイトルが示すものよりも少し具体的です。リクエストXMLをオブジェクトに逆シリアル化することを期待して、いくつかのメソッドを試しましたが、問題はありませんでした。読んでください、そして私が調べるためのいくつかのアイデアについて提案をしてください。

問題:

HL7形式のPOSTの受信でスタックします。これは約55kの投稿で、約200バイトの有用な情報が含まれています。これらの数バイトを抽出するだけで済みます。通常、これは、送信される追跡番号の数にもよりますが、約30バイトになります。いいえ、これを変更することについては何も言いません。

このHL7データは、要素の代わりに多くの属性がデータの伝送に使用されることを除いて、標準のXML形式です。繰り返しますが、私は送信者がこのようにそれをしていることに固執しているようです。(私の好みとWebサービスの経験は、標準のMS Soap / WSDLセットアップです。)

XSD.exeを使用して、(送信されるサンプルXMLからの)逆シリアル化されたデータを含むクラスを作成しましたが、XSDはすべての属性を要素に変換しているようです。結果のWCFサービスページを表示すると、受信しているもののようなxmlが表示されません。この違いがHL7リクエストの逆シリアル化を妨げているようですか?次の省略されたサンプルを参照してください。
省略されたインバウンド要求のサンプル(55kのサンプルを処理すると脳が死んでいたため)、最初の数行だけです。

<?xml version="1.0" encoding="utf-8"?>
<QUQI_IN300102XXX xmlns="urn:hl7-org:v3" ITSVersion="XML_1.0">
  <realmCode code="XXX" />
  <id extension="XX011111" />
  <creationTime value="20121220133424-0500" />
  <responseModeCode code="IMMEDIATE" />
  <versionCode code="V3-2010-12" />
  <interactionId extension="QUQI_IN300102XXX" />
  <processingCode code="P" />
  <processingModeCode code="T" />
  <acceptAckCode code="NE" />
  <receiver typeCode="RCV">
    <realmCode code="XXX" />
    <device>
      <realmCode code="XXX" />
      <id extension="XXXIB" assigningAuthorityName="Service" />
    </device>
  </receiver>
  <sender typeCode="SND">
    <realmCode code="XXX" />
    <device>
      <realmCode code="XXX" />
      <id assigningAuthorityName="CCC" />
    </device>
  </sender>
  <controlActEvent>
    <realmCode code="XXX" />
    <id extension="Tracking" assigningAuthorityName="TRANSTYPE" />
    <code code="Order" />
    <statusCode />
    <queryByParameter>
      <realmCode code="XXX" />
      <queryId extension="NJ011111A-20121220133343" />
      <parameterList>
        <realmCode code="XXX" />
        <accessionNum>
          <value extension="NJ011111A" />
        </accessionNum>
        <batchNumber>
          <value extension="120927001" assigningAuthorityName="ZZ1" />
          <value extension="120927002" assigningAuthorityName="ZZ1" />
        </batchNumber>



「batchNumber」は、インバウンドリクエストから取得する必要のあるプライマリデータです。
「WCFプロジェクト」サービスのヘルプページ(正しく覚えていれば、WCF RESTプロジェクトタイプのnugetパッケージを使用して作成されたもの)を表示すると、次のようになります。

<QUQI_IN300102QD>
  <realmCode>
<realmCode>
  <code>String content</code>
</realmCode>
<realmCode>
  <code>String content</code>
</realmCode>
  </realmCode>
  <id>
<id>
  <extension>String content</extension>
  <assigningAuthorityName>String content</assigningAuthorityName>
</id>
<id>
  <extension>String content</extension>
  <assigningAuthorityName>String content</assigningAuthorityName>
</id>
  </id>
  <creationTime>
    <QUQI_IN300102QDCreationTime>
  <value>String content</value>
   </QUQI_IN300102QDCreationTime>
  <QUQI_IN300102QDCreationTime>
    <value>String content</value>
   </QUQI_IN300102QDCreationTime>
  </creationTime>



現在、XSD.exeにフィードしたXMLは、サービスページが配布するもののようには見えません。また、何らかの理由で、postリクエストを渡すと、逆シリアル化されません。

それが私の問題を説明するのに十分な情報であることを願っています。

ソリューションの最良の選択は何ですか?
MVCプロジェクトを作成し、投稿データ型としてXMLDocを受け入れ、必要なものを取得するためにXML操作を行いますか?または他のオプション?
参考までに、リターンデータはある時点でXMLに挿入する必要がありますが、まだそれほど理解していません。

参考までに、Webサービスの作成に関する私の経験はVSに限定されています。あなたが知っている、ファイル、新しいプロジェクト、Webサービス。次に、消費プロジェクトのWSDLページにプロキシを追加し、それを使用します。もちろん、他の2つのプロジェクトで参照するためのクラスオブジェクトを含む3番目のプロジェクトと、いくつかのデータアクセスプロジェクトがあります。

Fiddlerを使用してリクエストを作成し、WCFトレースをオンにしました。
トレースから得られるものは次のとおりです。

XmlSerializerを使用して、ルート名'Binary'およびルート名前空間''(操作'methodTrackQLSBatch'およびコントラクト('ShipmentTracking'、' http: //tempuri.org/' )の場合)のXML本体を逆シリアル化できません。XMLに対応するタイプが、サービスの既知のタイプコレクションに追加されていることを確認してください。

それはタイプを知っています。非常に単純なXMLを使用するようにすべてを変更すると、完全に逆シリアル化されます。

よろしくお願いします。

簡潔に言えば、この大きなHL7リクエストを受け入れ、そこからデータを抽出し、結果を挿入してから返すにはどうすればよいでしょうか。(そして、私はおそらく「それを返す」部分を理解することができます、ええ。あなたは決して知りませんが。)

4

1 に答える 1

1

この場合、XML を逆シリアル化しても、それほど大きな利益は得られないように思えます。少量のデータのみに関心があり、最終的に XML を変更して返すだけの場合は、Linq to XMLを使用して XML を読み取って操作するだけです。(例: XDocumentXElementなど)

于 2013-02-01T20:49:50.163 に答える