5

一般に、XMLパーサー/デシリアライザーは、明示的にnullに設定されたnillable要素と省略されたオプション要素の違いを区別できますか?

次の複合型があるとします。

<complexType name="NiceType">
  <sequence>
    <element name="niceElem" nillable="true" type="int" minOccurs="0" />
  </sequence>
</complexType>

明示的に null に設定された要素 (例 1):

<niceType>
  <niceElem xsi:nil="true"/> 
</niceType>

省略された要素 (例 2):

<niceType>
</niceType>

一般に、JAX-B 実装や WCF の XML モジュールなどの .NET 類似のパーサーは、上記の例 1 と例 2 の違いを見分けることができますか? 言い換えれば、相互運用可能な方法で、例のように両方の NULL 表現を組み合わせて、NULL のさまざまな色合いを伝えることができますか?

4

1 に答える 1

2

XMLパーサー(例、、XmlReader)は特別に処理されません。ストリーム/ドキュメントに要素が表示されXmlDocumentますXDocumentxsi:nil

XmlSerializer処理xsi:nilします:そのコンテキスト内では、省略されたノードと同じことを意味します。を使用してsをXmlSerializerマークすることにより、を使用してWCFをシリアル化できます。DataContractXmlSerializerFormatterAttribute

DataContractSerializer属性を使用します:ただし、それらを使用するためのすべてのルールがわかりません(1つのケースは循環参照です)-要素を省略する可能性がはるかに高くなります。デ/シリアル化のパフォーマンスを向上させるための仮定に基づいて設計されているように、その場合にそれを使用xsi:nilしない限り、渡す必要はないと思います。DataContractSerializerDataContractSerializer

仕様からは、元々JavaScriptnullのように機能するように設計されているように見えますundefined。ここで、nullxsi:nil)は有効な値であり、undefined(省略)は値がまったく存在しないことです。特に複合型の場合-要素を提供できますが、そのコンテンツは省略できます(スキーマに従ってコンテンツが必要な場合でも)。

一般的に私はそれを避けます。直感的ではありません-それを使用するREST/SOAP APIは見たことがないと思います(排他的に使用するInfoPathを除く)。ほとんどの場合、を使用しますnull = undefined。xmlns宣言とその使用法も、いくつかの余分な貴重なバイトを消費します。

ボーナスマーク:要素をオプションにし、それがnull許容でない場合(たとえばxsd:int)、C#ジェネレーターは<Name>Specifiedプロパティを提供します-このように独自のプロパティを追加できます。これにより、省略と省略を区別できますxsi:nil(指定されている場合はnil、指定されていない場合はnull、省略)。ただし、これは。でのみ機能しXmlSerializerます。

于 2012-01-03T08:52:16.730 に答える