web-dev-qa-db-ja.com

XML、これは何ですか:nullまたは空の要素?

私の他の質問に関して: XMLはnull要素を逆シリアル化しますか?

APIテスト用にサードパーティのサーバーから次のような要素を取得しました。

<Taxable />
<DefaultPurchasePrice />

そのような要素がnullオブジェクトを表すのか、それとも空を表すのかについて、今私は混乱していることに気づきました。

オブジェクトについて言えば、それらは同じです。nullオブジェクトは通常、空のオブジェクト参照を意味しますか?しかし、XML要素をデータフィールド/値にマップしようとすると、異なる可能性があります。つまり、null文字列は空の文字列ですが、10進数の価格またはブール値の場合、空に等しい未定義ですが、定義されていない限りnullにはなりません。 null可能として。

繰り返しますが、私のXmlSerializerの問題は、そのような空の要素の転送を処理できないことです。コードで簡単に修正できますか?または、XMLに明確に定義されたXMLがあることを提供するように人々に依頼する必要がありますか?そのような空のXML要素は未定義のようです:ここにありますが、nullまたは空のいずれかである可能性がありますXML要素自体には関係ありませんか?しかし、その要素については、すべてのC#クラスデータフィールドを文字列型として設定しない限り、コードはそれを処理する方法を理解する必要があります。そうしないと、コードが空またはnullのXML要素を特定のデータフィールドに直接マップしようとすると、確実に失敗します。

XMLにはこれらの要素がたくさんあり、これらの特別な要素については、.NET XMLシリアル化コードでこれらのフィールドを文字列としてマッピングする必要があり、文字列が空でない場合は対応するデータ型に分類する必要があるため、この質問をする必要があります。それらをnullに設定します。そして、逆シリアル化を行う前に、これらの空の要素を削除することになります。これは、はるかに簡単だからです。しかし、私はさまよっています:「コードで実際に何をしているのですか?null要素または空の要素を削除しただけですか?明らかに異なるためです!しかしXML自体には「null」の概念がないため、XMLを書いている人は同じだと考えており、nullか空かを判断するのは私の責任であると主張する人もいますが、XMLを使用すると 'null'要素をより明確に表す

編集:

私が提示した例では、これら2つの要素は、空の要素ではなく、明らかにnullである必要があります。 XMLには実際にはnullの概念はありませんが、これらの要素は省略されるか(nullの場合は、XMLに入れないでください)、@ svickで説明されているより適切な表現を使用できます。または、他の場合には、意味があるときに空の要素を使用する必要があります。ただし、10進数またはブール値ではありません。

11
Paul L

<課税対象/>
<DefaultPurchasePrice />

これは何ですか:nullまたは空の要素?

それは空です。意味的には次と同じです。

<Taxable></Taxable>
<DefaultPurchasePrice></DefaultPurchasePrice>

XML自体に存在する唯一の「null」概念は、欠落している要素です。 XMLのセマンティクスを使用して、要素を指定することはできませんand nullと言います。これを行うには、なんらかのスキーマ(DTD、XSD、Schematronなどの明示的なスキーマ、または暗黙的/論理スキーマ)が必要です。

ただし、これはXMLを解釈するアプリケーションや公式のXML関連テクノロジを制限するものではありません。たとえば、XSDにはxsi:nil="true"属性があります。これらのスキーマ属性の一部をXMLに適用できますが、これらの属性は「純粋な」XMLではありません。これらは、XSDスキーマによって提供される追加です。

これは、XSDが基本的なXML構造の上に独自のセマンティクスを自由に構築し、存在しない場所に明示的なnilを追加した場合です。この柔軟性は、XMLの利点と見なされます。

16

これは、XMLとお気に入りの言語のオブジェクトモデルとの間にデフォルトのマッピングがないという事実に帰着すると思います。次のXMLについて考えてみます。

<Person Name="John">
    <Father>
        <Person Name="Jim" />
    </Father>
    <Mother>
        <Person Name="Jenny" />
    </Mother>
</Person>

Personにはプロパティ(またはフィールド)FatherMotherがありますか?または、Personは、タイプFatherおよびMother(おそらく抽象ベースタイプFamilyMemberから継承)のオブジェクトを含むことができるコレクションを表しますか?これはXMLからは明らかではなく、オブジェクトモデルでこれをどのように表現するかはあなた次第です。 (スキーマの存在はそれをいくらか変更しますが、それでも解釈の余地があります。)

同様に、nullの概念はXMLには存在しません。一方、空の要素の概念は、オブジェクトモデルに直接マップされません。そして、それらは同じではなく、空の要素はまだ属性を持つことができ、「タイプ」(要素名)を持っています。

一般的に、良い解決策はnull<Null />)を表す特別なXML要素を持つことだと思いますが、特定のケースでは別の解決策の方が理にかなっているかもしれません。

2
svick