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


166

私は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は不自然なものですので、あまり深く読まないでください。:)

回答:


121

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

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

From:The W3C

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

明確化:
本の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"は要素にデータがないことを許可します。別の例は、タイプdecimalの要素です。それらを空にしたい場合は、 ""と10進数のみを許可する列挙文字列を結合するか、nillableの10進数を使用できます。

11
xsi:nilの使用は正しいですが、適切な名前空間内にあることを確認する必要があります:xmlns:xsi = " w3.org/2001/XMLSchema-instance "
STW

それは実際xmlns:xsi="http://w3.org/2001/XMLSchema-instance"です。欠落しているhttp://に注意してください。名前空間文字列は実際にはxmlパーサーへの単なる文字列であり、URIではないため、これは重要です。
Burak Arslan、2015

9
ふむ、それはまだ少し間違っていると思います。それはあるはずですxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"。「www。」に注意してください。w3.org/TR/xmlschema-1/#no-xsiを
Janne Mattila、

私の回答で述べたように、それは要素の状態の表現ではなく、要素の使用に関する制約であるため、私は解釈に同意しません
Oakcool

2
@ChrisV:真ではxsi:ありません。接頭辞を宣言する必要があります。名前空間を認識するXMLパーサーは、xsi:宣言せずに接頭辞を使用しようとすると、XMLドキュメントを拒否します。ここでは関係スペックはあるw3.org/TR/xml-names/#nsc-NSDeclaredのみ事前定義プレフィックスがあると言う:(「プレフィックスが宣言された名前空間制約」)xml:xmlns:。XMLスキーマは、XML名前空間仕様に基づいて構築されますが、実際にXML名前空間仕様に違反するため、事前定義された追加のプレフィックスは追加されません。
Simon Kissane、2016

9

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


8

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

出典


7

w3リンクのドキュメント

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

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

<test></test>
<test/>

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

XMLスキーマ:構造は、空のコンテンツを必要としない、または必ずしも許可しないコンテンツタイプにもかかわらず、コンテンツがない場合に要素が「有効」として受け入れられる必要があることを通知するメカニズムを導入します。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>

7
これが空の要素の推奨事項です。あなたは空=== nullという意見ですか?状況によって異なりますが、この2つには違いがあると思います。それらが同じであるという発言をしている場合は、その議論を回答で言及することをお勧めします。
Rob Hruska

1
空はnullと同じではありません。もしそうなら、このスタックオーバーフローの質問は決して尋ねられなかっただろう。この答えは間違っています。ただし、プログラマーは、xmlを読み取るロジックが、不足している要素またはxsi:nilを処理する準備ができているかどうかを判断する必要があります。そうでない場合は、これらの形式のいずれかを使用する必要があるかもしれません。つまり、null / missing要素と空の要素の区別を失う必要があるかもしれません。
ToolmakerSteve、2015年

@RobHruskaはい、そうです、それは空の要素の定義ですが、KitsuneYMGによってポイントされたW3C定義を考慮すると、要素はnullでなければならないことを定義し、その表現は、次に、その現在の状態の表現をタグ付けするので、私はその答えに同意しません。空はnull要素の最適な表現だと思います。アイデアは単純です。適切な構造を維持するには、すべての要素を表現する必要があります。そうしないと、その存在を知らないため、それを誤って表す可能性があります。
Oakcool、2015年

4

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


ドキュメント公開アプリで、要素にコンテンツがない場合にタイトルページの日付をデフォルトで現在の日付にしたい場合は、 date要素全体を、アプリはタイトルページのどこにあるかわからないため、あまり役に立ちません。表示される日付。(省略された要素に可能な場所が1つしかない場合、これは問題ではありません。実際のドキュメントの語彙では、ほとんどすべての要素に多くの可能な場所があります。)
CM Sperberg-McQueen

4

属性または要素を省略するだけで、あまり正式でないデータでうまく機能します。

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

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

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

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


2

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

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

ReportMasterバージョン2では、定義されている、または定義されていない属性がいくつか追加されています。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.