2009-08-22 20 views
0

多くのサードパーティのC/C++ライブラリの.dll関数を呼び出し、ac/C++構造体配列(SA)を返すネイティブC/C++ .dllプログラムを作成しています。 18列×0-n行。この返された値は、WCF C#Webサービスプログラムでキャプチャされ、.dllと "相互運用"し、.net xmlライブラリを使用して、メッセージをWebサービスクライアントに送信する前にシリアル化します。XML/XSD形式のC/C++構造体配列を返す

ここでは、(a)C/C++でデータを準備して返す前にSAを作成し、(b)C#Webサービスプログラムで受け取ったSAをXMLにシリアル化します。

このオーバーヘッドを避けるために、私のC/C++ DLLにSAを取り込むのではなく、XMLシリアル化された文字列またはファイルを読み込み、この結果をC#Webサービスプログラムに返して、すでにシリアル化されたデータを直接クライアントに送信します。

1)私の考えが正しい場合:私が知りたいのですが、この時点で

2)そうであれば、データをXMLに読み込むだけでなく、列、長さ、データ型の名前をヘッダとして含めることもできます。誰かが、そのヘッダを記述するためのXSD文字列/ファイルを作成する必要があると私に言った。あなたはこのことについてどう思いますか?

3)返されるXMLデータに問題がないため、C#プログラムにどのようなことを考慮する必要がありますか? XSDデータ?

これを読んでいただきありがとうございます。

答えて

0

XSD(XML Schema)は、XML形式の検証と記述に最も役立ちます。私の経験では、通常あなたが回るものではなく、エンドポイントにはすでにスキーマが用意されていることがよくあります。両方のアプリケーションを管理しているとすれば、それを省略してXMLだけにすることができます。

ただし、あなたが何らかの理由でそれを信頼しない場合は、C#コードにスキーマを持ち、C++部分からXMLを検証できます。また、このXMLをいくつかのサードパーティに渡す場合、スキーマも役立ちます。

問題が発生する可能性のあるものは、文字エンコーディングです。 XMLをutf-8(それに応じて、XML宣言にエンコーディング属性を設定した場合はutf-8がデフォルトであることを確認する必要があります)。これはC++の部分で行うこともできますし、おそらくC#部分で簡単に行うこともできます。

私は間違ったステップがあるのは間違いだと思いますが、おそらく、XMLではない別のフォームでC++のデータを使用することを検討すると便利でしょう。あなたがすでに持っている形式は、そのような状況で役に立ちます。


私はあなたのための例示的なスキーマが含まれ、各行は、名前、長さおよびタイプを有する:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="row-column-format"> 
    <xs:element name="rows"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="column"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
       <xs:attribute name="name" type="xs:string" /> 
       <xs:attribute name="type" type="xs:string" /> 
       <xs:attribute name="length" type="xs:int" /> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

なお、この構造のXMLフォーマットを記述する:

<?xml version="1.0" encoding="utf-8"?> 
<rows xmlns="row-column-format"> 
    <column name="name1" type="type1" length="1" xmlns="">column1</column> 
</rows>