2009-06-18 10 views
2

現在の実装Webサービスに適したXMLタイプは何ですか?テーブルと

のSQL Server 2005データベースは、xml型のMessageXmlという列とメッセージを呼ばれます。

C#XElement型のMessageXmlというフィールドを持つMessageというクラスを生成する、Linq to SqlクラスのC#ライブラリプロジェクトです。

XElement型のMessageXmlというプロパティを持つMessagePayloadクラスを公開するWCF Webサービス。

Webサービスは、LinqがSqlに作成したメッセージクラスを提供しません。私は軽量オブジェクトを間に入れて使用します。

質問

は本当に私は私のWCFサービスで使用したいか、より良いタイプがあるタイプのXElementです。サービスに渡すことを意図しているxmlは完全なドキュメントでなければなりません。また、私はXElementとしてXML文書をロードするのに少し問題があります。私はサービスの軽量クラスで完全なxmlドキュメントタイプを公開する必要があると思いますが、XDocumentとXmlDocumentの違いについて少し混乱します。

さらに、WCF Messageクラスには、シリアル化できないXDeclaration型のプロパティが含まれているため、XDocument型のプロパティで公開することはできません。

私がXmlDocumentを使用すると、LinqクラスとLightweightクラスの間の変換でxmlタイプの変な変換を行う必要があります。

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(message.MessageXml.ToString()); 

MessageEnvelope retVal = new MessageEnvelope() 
{ 
     MessageXml = doc, 
}; 

XmlDocumentオブジェクトは、右のいずれかのように思えるし、私はいくつかの変換を行う必要があるでしょう知っているが、可能性として適切に近い取得したいです。

答えて

3

あなたはXElementオブジェクトまたはのXmlElementのいずれかを使用することができます。

public XmlElement GetXmlElement() 
{ 
    var doc = new XmlDocument(); 
    doc.Load(PREFIX + @"Enumerations.wsdl"); 

    return doc.DocumentElement; 
} 

public XElement GetXElement() 
{ 
    var doc = XDocument.Load(PREFIX + @"Enumerations.wsdl"); 
    return doc.Root; 
} 

あなたはXDocumentXmlDocumentのいずれかを望んでいません。あなたが返すものは、SOAPエンベロープを含むXML文書の途中にあることに注意してください。文書の中に文書を置くことはできないので、必要なものは要素です。

-1

クラスのシリアル化(文字列はいつもうまくいきます)を必要とするタイプを使用して、ドキュメントの整合性を維持するために必要なときにサーバー側またはクライアント側で変換を行います。 1つ以上のXElementからXDocumentを構築することもできます。そのため、XElementを使用します。

最悪のケースでは、クラスのシリアル化動作をオーバーライドすることもできます(リフレクションに優れていればあまりにもひどい)。

XmlDocumentはLinq以外の古い文書です。それらは異なるクラスで実装された同じ概念です。

+1

-1:XMLは文字列と同じではありません。 XMLの表現には使用しないでください。 –

+0

私はそれがシリアル化のために変換の前後にそれを検証しなければならない理由を知っています... – marr75

-2

一般に、XDocumentおよびXElememntは、性能面ではXmlDocumentおよびXmlElementであることが好ましい。

しかし、私は次の理由でWCFサービスを介してXML文書を送信するためにstringを使用することをお勧め:

  1. 相互運用性
    • クライアントは、(特定の.NETフレームワークのバージョンに関連付けられていませんクライアントはXDocumentまたはXmlDocumentを使用することができます.WCFサービスがこのように設定されている限り、Javaベースのクライアントでもサポートできます。
  2. 元のXMLドキュメントにXML宣言が正しく含まれている場合は、XML宣言を正しく処理してください。

注意:大きなxmlドキュメントをサポートするように設定を適切に調整してください。たとえば、basicHttpBindingのデフォルトの最大メッセージサイズは64KBです。

+1

-1:ナンセンス合計。ちょうどXmlElementを送信してください。それのどこが悪いんだい? XMLを送信するだけです。 –

3

John Saundersはここにお金があります。それだけです

<xs:complexType> 
    <xs:sequence> 
    <xs:any minOccurs="0" processContents="lax"/> 
    </xs:sequence> 
</xs:complexType> 

:あなたはどちらかXmlElementまたはXElementを返すときに生成されたWSDLを見れば、少し詳しく説明するには、このようなものが表示されます。基本的には、XMLはここに行くことができます。また、Chansikの提案とは異なり、戻り型を.NET固有の型にバインドしないことも意味します。

だから、文字列を使う必要はありません。

関連する問題