175

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/>子要素があります(以下のTStamperから):

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

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

上記の例の XML は不自然に作成されているため、深読みしないでください。:)

4

7 に答える 7

129

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

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

出典: W3C

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

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

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

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

于 2009-04-23T03:54:41.047 に答える
9

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

ソース

于 2009-04-21T19:32:28.580 に答える
8

w3リンクのドキュメント:

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

これらは推奨される形式であると述べています。

<test></test>
<test/>

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

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

この答えを明確にするには:

<?xml version="1.0" encoding="utf-8" ?>
<Books>
  <Book>
    <!--This element should alway be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true"/>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>
    </pages>
    <!--Valid representation of a null or empty ISBN-->
    <ISBN></ISBN>
  </Book>

  <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 could be confusing and misguiding since its not present-->
  </Book>
</Books>
于 2009-05-01T07:34:12.143 に答える
4

属性または要素を単に省略することは、あまり形式的でないデータでうまく機能します。

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

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

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

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

于 2009-04-23T03:44:58.700 に答える
2

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

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

ReportMaster バージョン 2 では、さらにいくつかの属性が追加されました。これらの属性は、定義されている場合と定義されていない場合があります。

「タグなしは null を意味する」表現を使用すると、ReportMaster 1 xml ファイルを読み取るための下位互換性が自動的に得られます。

于 2009-04-21T19:42:45.623 に答える