web-dev-qa-db-ja.com

null XML要素を表す正しい方法は何ですか?

null要素はいくつかの方法で表されています。

要素はxsi:nil="true"で存在します

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

要素は存在しますが、空の要素として表されます( 'empty'とnullは意味的に異なるため間違っていると思います):

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

要素は、返されたマークアップにまったく存在しません

 <book>
     <title>Beowulf</title>
 </book>

要素には<null/>子要素があります(from TStamper below):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

そのようなnull値を表す正しい、または標準的な方法はありますか?上記の例以外の方法はありますか?

上記の例のXMLは不自然であるため、あまり読みすぎないでください。 :)

157
Rob Hruska

xsi:nilは、次のような値を表す正しい方法です。DOM Level 2呼び出しgetElementValue()が発行されると、NULL値が返されます。 xsi:nilは、コンテンツタイプが空の要素を通常許可しない場合でも、コンテンツのない有効な要素を示すためにも使用されます。

空のタグが使用される場合、getElementValue()は空の文字列( "")を返します。タグが省略されると、作成者タグも存在しません。これは、 'nil'に設定することと意味的に異なる場合があります(例: "Series"をnilに設定すると、本はシリーズに属さない場合があります。シリーズを省略すると、シリーズは現在の要素に適用できません

From: The W3C

XMLスキーマ:Structuresは、空のコンテンツを必要としない、または必ずしも許可しないコンテンツタイプにもかかわらず、コンテンツがない場合に、要素を「有効」として受け入れる必要があることを通知するメカニズムを導入します。値がtrueの属性xsi:nilを持っている場合、要素はコンテンツなしで有効な場合があります。そのようにラベル付けされた要素は空である必要がありますが、対応する複合型で許可されている場合は属性を保持できます。

明確化:
book xml要素があり、子要素の1つがbook:seriesである場合、入力する際に​​いくつかのオプションがあります。

  1. 要素を完全に削除する-これは、シリーズがこの本に適用されないこと、またはその本がシリーズの一部ではないことを示す場合に実行できます。この場合、book:seriesに一致するテンプレートを持つxsl変換(または他のイベントベースのプロセッサ)は呼び出されません。たとえば、xslがbook要素を表の行(xhtml:tr)に変換する場合、このメソッドを使用して誤った数の表のセル(xhtml:td)を取得できます。
  2. 要素を空のままにする-これは、シリーズが「」または不明であること、または本がシリーズの一部ではないことを示している可能性があります。 book:seriesに一致するxsl変換(またはその他のエバーベースのパーサー)が呼び出されます。 current()の値は「」になります。このメソッドを使用すると、次に説明するものと同じ数のxhtml:tdタグを取得できます。
  3. Xsi:nil = "true"の使用-これは、book:series要素が空ではなくNULLであることを示します。 book:seriesに一致するテンプレートを持つxsl変換(または他のイベントベースのパーサー)が呼び出されます。 current()の値は空になります(空の文字列ではありません)。このメソッドと(2)の主な違いは、book:seriesのスキーマタイプが空の文字列( "")を有効な値として許可する必要がないことです。これはシリーズ要素には意味がありませんが、スキーマで列挙型として定義されている言語要素の場合、xsi:nil = "true"を使用すると、要素にデータを含めることはできません。別の例は、decimal型の要素です。それらを空にしたい場合は、 ""と小数のみを許可する列挙文字列を結合するか、nillableの小数を使用できます。
111
KitsuneYMG

XMLには基本的にnullの概念がないため、正規の答えはありません。ただし、Xml /オブジェクトマッピングが必要であると仮定します(オブジェクトグラフにはnullがあるため)。あなたの答えは「あなたのツールが使用するものは何でも」です。処理を記述する場合、それは何でも好きなことを意味します。 XMLスキーマを使用するツールの場合、xsi:nilが最適です。ほとんどのマッパーでは、一致する要素/属性を省略することが方法です。

9
StaxMan

XMLの検証方法によって異なります。 XMLスキーマ検証を使用する場合、null値を表す正しい方法は、xsi:nil属性を使用することです。

[ ソース ]

8

W3リンクのドキュメント

http://www.w3.org/TR/REC-xml/#sec-starttags

これが推奨されるフォームであると言います。

<test></test>
<test/>

他の回答で言及されている属性は検証メカニズムであり、状態の表現ではありません。 http://www.w3.org/TR/xmlschema-1/#xsi_nil を参照してください

XMLスキーマ:構造は、を必要としないコンテンツタイプにもかかわらずコンテンツがない場合に、要素が・valid・として受け入れられるべきであることを通知するメカニズムを導入します。または空のコンテンツを必ず許可することもあります。値がtrueの属性xsi:nilを持っている場合、要素はコンテンツなしで有効な場合があります。 そのようにラベル付けされた要素は空でなければなりませんが、対応する複合型で許可されている場合は属性を持ちます。

この答えを明確にするには:コンテンツ

  <Book>
    <!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
      <anotherAttribute name="Color">Blue</anotherAttribute>
    </BuildAttributes>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>            
    </pages>
    <!--Missing ISBN number could be confusing and misguiding since its not present-->
  </Book>
</Books>
6
Oakcool

スキーマのセマンティクスが要素にデフォルト値があることを示し、要素が存在しない場合はデフォルト値を使用する必要があることを示す場合、xsi:nilを使用します。前文が自明なほどひどい考えではない賢い人がいると仮定しなければなりませんが、9種類の悪いように聞こえます。私がこれまでに扱ったすべてのXML形式は、要素を省略してnull値を表します。 (または属性、およびxsi:nilで属性をマークすることは幸運です。)

4
Robert Rossney

属性や要素を省略するだけで、あまり形式的なデータではうまく機能しません。

より高度な情報が必要な場合、GMLスキーマは属性nilReasonを追加します。例:in GeoSciML

  • 「true」の値を持つxsi:nilは、使用可能な値がないことを示すために使用されます
  • nilReasonは、欠損値の追加情報を記録するために使用できます。これは、GMLの標準的な理由(missing, inapplicable, withheld, unknown)の1つ、またはother:で始まるテキスト、またはより詳細な説明へのURIリンクである可能性があります。

データを交換するとき、XMLが一般的に使用される役割、1人の受信者に送信されるデータ、または特定の目的のために送信されるデータには、他の誰かが支払いをしたり、異なる認証を受けた人が利用できるコンテンツが隠されている場合があります。コンテンツが欠落している理由を知ることは非常に重要です。

科学者は、情報が欠落している理由にも懸念を持っています。たとえば、品質上の理由で削除された場合、元の不良データを見たい場合があります。

4
Andy Dent

多くの場合、Null値の目的は、以前のバージョンのアプリケーションには存在しなかったデータ値を提供することです。

アプリケーション「ReportMaster」バージョン1のxmlファイルがあるとします。

現在、ReportMasterバージョン2では、定義されている場合と定義されていない場合がある属性がさらに追加されています。

「no tag means null」表現を使用すると、ReportMaster 1 xmlファイルを読み取るための自動下位互換性が得られます。

2
Jeroen Dirks