質問
私は見た null
要素はいくつかの方法で表現されます。
要素は次の状態で存在します xsi:nil="true"
:
<book>
<title>Beowulf</title>
<author xsi:nil="true"/>
</book>
要素は存在しますが、空の要素として表されます (これは「空」なので間違っていると思いますが、 null
意味的に異なります):
<book>
<title>Beowulf</title>
<author/>
</book>
<!-- or: -->
<book>
<title>Beowulf</title>
<author></author>
</book>
返されたマークアップには要素がまったく存在しません:
<book>
<title>Beowulf</title>
</book>
要素には <null/>
子要素 (から Tスタンパー 下に):
<book>
<title>Beowulf</title>
<author><null/></author>
</book>
そのようなものを表現するための正しい、または標準的な方法はありますか? null
価値?上記の例以外にも方法はありますか?
上記の例の XML は不自然であるため、深読みしないでください。:)
解決
xsi:nil は、次のような値を表す正しい方法です。DOM レベル 2 呼び出し getElementValue() が発行されると、NULL 値が返されます。xsi:nil は、要素のコンテンツ タイプが通常は空の要素を許可しない場合でも、コンテンツのない有効な要素を示すためにも使用されます。
空のタグが使用されている場合、getElementValue() は空の文字列 ("") を返します タグを省略すると、author タグも存在しません。これは、「nil」に設定することとは意味的に異なる場合があります (例:「シリーズ」を nil に設定すると、その本はどのシリーズにも属さないことになる可能性がありますが、シリーズを省略すると、シリーズが現在の要素に適用できない要素であることを意味する可能性があります)。
から: W3C
XML スキーマ:構造は、要素が有効なものとして受け入れられるべきであることを信号するメカニズムを導入します。要素は、属性xsi:nilがtrueである場合、コンテンツなしで有効な場合があります。ひとつの 要素は空でなければなりませんが、 で許可されている場合は、属性を運ぶことができます。 対応する複合型。
説明:
book xml 要素があり、子要素の 1 つが book:series である場合、それに入力するときにいくつかのオプションがあります。
- 要素を完全に削除する - シリーズがこの本に適用されないこと、またはその本がシリーズの一部ではないことを示したい場合に実行できます。この場合、book:series に一致するテンプレートを持つ xsl 変換 (または他のイベント ベースのプロセッサ) は呼び出されません。たとえば、xsl が book 要素を表の行 (xhtml:tr) に変換する場合、このメソッドを使用すると表のセル (xhtml:td) の数が正しくなくなる可能性があります。
- 要素を空のままにする - これは、シリーズが "" であるか、不明であるか、または書籍がシリーズの一部ではないことを示している可能性があります。book:series に一致する xsl 変換 (または他の evernt ベースのパーサー) が呼び出されます。current()の値は「」となります。この方法を使用すると、次に説明する方法と同じ数の xhtml:td タグを取得できます。
- xsi:nil="true" の使用 - これは、book:series 要素が空ではなく NULL であることを意味します。book:series に一致するテンプレートを持つ xsl 変換 (またはその他のイベント ベースのパーサー) が呼び出されます。current() の値は空になります (空の文字列ではありません)。この方法と (2) の主な違いは、book:series のスキーマ タイプでは有効な値として空の文字列 ("") を許可する必要がないことです。これは、シリーズ要素の場合は実際には意味がありませんが、スキーマで列挙型として定義されている言語要素の場合、xsi:nil="true" により、要素にデータを含めることができません。別の例は、10 進数タイプの要素です。それらを空にしたい場合は、「」と小数点のみを許可する列挙文字列を結合するか、nill 可能な小数点を使用できます。
他のヒント
XML には基本的に null の概念がないため、標準的な答えはありません。ただし、Xml/オブジェクトマッピングが必要だと思います(オブジェクトグラフにはnullがあるため)。したがって、答えは「ツールが何を使用するか」です。ハンドリングと書いた場合、それはあなたが好むものを意味します。XML スキーマを使用するツールの場合、 xsi:nil
が進むべき道です。ほとんどのマッパーでは、一致する要素/属性を省略することがそれを行う方法です。
それは XML を検証する方法によって異なります。XML スキーマ検証を使用する場合、正しい表現方法 null
価値観は xsi:nil
属性。
[ソース]
w3 リンクのドキュメント
http://www.w3.org/TR/REC-xml/#sec-starttags
これが推奨される形式であると述べています。
<test></test>
<test/>
他の回答で言及されている属性は検証メカニズムであり、状態の表現ではありません。を参照してください。 http://www.w3.org/TR/xmlschema-1/#xsi_nil
XML スキーマ:構造では、 というシグナリングのメカニズムは、 要素は ·valid· にもかかわらずコンテンツがない場合 空を必要としない、または必ずしも許可しないコンテンツタイプ コンテンツ。要素は ·valid·without content (コンテンツなし) 属性 xsi:nil を値 true に設定します。 そのようにラベル付けされた要素は、 空, ですが、対応する 複合型。
この答えを明確にするには:コンテンツ
<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>
あなたが使う xsi:nil
スキーマ セマンティクスが、要素にデフォルト値があり、要素が存在しない場合はデフォルト値を使用する必要があることを示している場合。賢い人の中には、前の文が明らかにひどい考えではない人もいると想定しなければなりませんが、私にとっては 9 種類の悪い考えのように思えます。私がこれまでに扱ったすべての XML 形式は、要素を省略することによって null 値を表します。(または属性、そして属性に幸運をマークしてください xsi:nil
.)
単純に属性または要素を省略することは、形式的でないデータではうまく機能します。
より高度な情報が必要な場合は、GML スキーマに属性 nilReason を追加します。例:で 地球科学ML:
xsi:nil
値が「true」の場合は、値が利用できないことを示すために使用されます。nilReason
欠損値の追加情報を記録するために使用される場合があります。これは標準的な GML の理由の 1 つである可能性があります (missing, inapplicable, withheld, unknown
)、または先頭に追加されたテキストother:
, 、または、より詳細な説明への URI リンクである場合があります。
データを交換するとき、XML が一般的に使用される役割、1 人の受信者に送信されるデータ、または特定の目的のために送信されるデータには、料金を支払った、または別の認証を受けた他の人が利用できるコンテンツが隠蔽されている場合があります。コンテンツが欠落した理由を知ることは非常に重要です。
科学者たちは、なぜ情報が欠落しているのかにも懸念を抱いています。たとえば、品質上の理由でデータが削除された場合、元の不良データが必要になる場合があります。
多くの場合、Null 値の目的は、アプリケーションの以前のバージョンには存在しなかったデータ値として機能することです。
したがって、アプリケーション「ReportMaster」バージョン 1 の XML ファイルがあるとします。
ReportMaster バージョン 2 では、定義できる属性と定義できない属性がさらにいくつか追加されました。
「タグなしは null を意味する」表現を使用すると、ReportMaster 1 XML ファイルを読み取るための自動的な下位互換性が得られます。