簡體   English   中英

XML,這是什么:null或空元素?

[英]XML, what is this: null or empty element?

關於我的另一個問題: XML反序列化null元素?

我從第三方服務器獲得這些元素用於API測試:

<Taxable />
<DefaultPurchasePrice />

我剛剛意識到,現在我自己也在混淆自己這樣的元素是否代表空對象或空。

談論對象,它們是一樣的,null對象通常意味着空對象引用對嗎? 但是嘗試將XML元素映射到數據字段/值,它們可能是不同的,即空字符串是空字符串,但對於十進制價格或布爾值,它們是未定義的,等於空,但不會為空,除非定義它們可以為空。

同樣,我的XmlSerializer的問題是無法處理像這樣的空元素。 我可以在我的代碼中輕松修復它。 或者我應該問人們提供的XML有一個定義良好的XML嗎? 因為看起來像這樣的空XML元素是未定義的:它在這里,但是對於XML元素本身可能是null還是空無關緊要? 但是對於那個元素,我的代碼需要弄清楚如何處理它,除非我將所有的C#類數據字段設置為字符串類型。 否則,如果我的代碼試圖直接將空或空XML元素映射到某個數據字段,它肯定會失敗。

我不得不問這個問題,因為我遇到XML有很多這些元素,對於那些特殊元素,我的.NET XML序列化代碼需要將這些字段映射為字符串,如果字符串不為空,我將它們視為對應的數據類型,否則我將它們設置為null。 在我進行反序列化之前,我最終刪除了那些空元素,因為它更容易。 但我徘徊:“我在代碼中真正做了什么? 我只是刪除了空元素或空元素嗎?因為它們明顯不同!但是編寫XML的人認為它們是相同的,因為XML本身沒有概念'null',有些人認為我有責任決定它是null還是空。但XML確實能讓你以更清晰的方式表示'null'元素

編輯:

在我提供的示例中,這兩個元素顯然應該是null而不是空元素。 XML實際上沒有null的概念,但是這些元素可以省略(如果它們是null,不要將它們放入XML中),或者使用更好的表示,如@svick所述。 或者在其他情況下,應該在有意義時使用空元素。 但不適用於Decimal或Boolean。

<Taxable />
<DefaultPurchasePrice />

這是什么:null或空元素?

它是空的。 它在語義上與以下相同:

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

XML本身存在的唯一“空”概念是缺少元素。 您不能使用XML的語義指定一個元素說它是null。 您必須具有某種模式(顯式模式,例如DTD,XSD或Schematron,或隱式/邏輯模式)才能執行此操作。

但這並不限制解釋XML的應用程序,也不限制與XML相關的官方技術。 例如,XSD具有xsi:nil="true"屬性。 即使您可以將某些架構屬性應用於XML,這些屬性也不是“純”XML; 它們是XSD架構提供的附加功能。

這是一種情況,XSD可以在基本XML結構之上自由構建自己的語義,並添加一個不存在的顯式nil 這種靈活性被認為是XML的優勢。

我認為這歸結為XML和您喜歡的語言的對象模型之間沒有默認映射。 考慮以下XML:

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

PersonFatherMother屬性(或領域)嗎? 或者Person代表一個可以包含FatherMother類型的對象的集合(可能繼承自抽象基類型FamilyMember )? 這在XML中並不清楚,您可以在對象模型中表示這一點。 (模式的存在會有所改變,但它仍然留有解釋空間。)

同樣的概念, null不存在於XML。 另一方面,空元素的概念不直接映射到對象模型。 並且它們不相同,空元素仍然可以具有屬性,並且它具有“類型”(元素名稱)。

通常,我認為好的解決方案是使用一個特殊的XML元素表示null<Null /> ),但另一種解決方案可能在您的特定情況下更有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM