2011-08-30 82 views
9

關於我的其他問題:XML deserialize null elements?XML,這是什麼:null或空元素?

我得從API測試第三方服務器這樣的元素:

<Taxable /> 
<DefaultPurchasePrice /> 

我才意識到,現在我困惑自己是否喜歡的元素代表空對象或空。

談到對象,它們是相同的,空對象通常意味着空對象引用權?但試圖將XML元素映射到數據字段/值,它們可能不同,即空字符串爲空字符串,但對於Decimal價格或布爾值,它們未定義,其等於空,但不會爲空,除非它們已定義作爲可空。

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

我必須問這個問題,因爲我遇到的XML有很多這些元素 和那些特殊元素,我的.NET XML序列化代碼需要將這些字段映射爲字符串,如果字符串不是空的,我將它們分成記者數據類型,否則我將它們設置爲null。在我進行反序列化之前,我最終刪除了這些空元素,因爲它更容易。但我真的在流浪:「我在我的代碼中究竟做了什麼?」我剛剛刪除了空元素還是空元素?因爲它們明顯不同!但是編寫XML的人認爲它們是相同的,因爲XML本身沒有「空」,而有些人的觀念認爲,這是我的責任,以決定是否爲空或空的,但XML也使您能夠represent 'null' elements in a clearer way

編輯:

在我給出的例子,這兩個因素顯然應該是null而不是空元素XML實際上沒有null的概念,但是這些元素可以被省略(如果它們爲null,不要將它們放入XML中)或者使用更好的表示方式,如@svick或者在其他情況下爲空元素應該在有意義時使用。但不適用於十進制或布爾值。

+2

空元素標記是有效的XML。你如何解釋,無效,無論什麼,這完全取決於你。 – fpmurphy1

+1

@fmurphy:這應該是一個答案...我會upvote它 –

+0

@fpmurphy,所以它是一個空的元素呢? –

回答

15

<應稅/ >
< DefaultPurchasePrice/>

這是什麼:空或空元素?

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

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

存在於XML本身中唯一的「null」概念是缺少的元素。使用XML的語義,您無法指定元素說它爲空。您必須具有某種模式(顯式模式,如DTD,XSD或Schematron或隱式/邏輯模式)來執行此操作。

這並不限制解釋XML的應用程序,或者與XML相關的官方技術。例如,XSD具有xsi:nil="true"屬性。儘管可以將這些模式屬性中的一些應用於XML,但這些屬性不是「純粹的」XML;它們是由XSD架構提供的附加功能。

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

+0

另一個很好的解釋。幾乎一致同意。但'xsi:nil ='ture''是Xml架構的內置聲明,您可以使用它來呈現'null'元素。這有點像說沒有任何圖書館,C#不能做任何事情。但同樣,我對XML的理解是有限的:D –

+0

@pstar:澄清並糾正了一下。請讓我知道,如果這是更好,更糟糕,或相同:) –

+0

謝謝你,似乎更清晰。但我現在又多了一個問題。我不確定xmlns:xsi和XSD的關係,我是否必須具有xmlns:xsi作爲使用XSD的最小值,從而獲得xsi:nill和其他幾個免費的內置屬性? –

2

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

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

是否Person有屬性(或領域)FatherMother?或者Person代表一個集合,它可以包含類型爲FatherMother(可能繼承自抽象基類型FamilyMember)的對象?這在XML中不是很清楚,它取決於您如何在對象模型中表示這一點。 (模式的存在會有所改變,但它仍然有解釋的餘地​​。)

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

一般來說,我認爲很好的解決方案是擁有一個代表null<Null />)的特殊XML元素,但是另一種解決方案可能對您的具體情況更有意義。

+0

解釋得很好。你在最後一段提到的另一個解決方案是什麼? –

+0

你可以使用像你提到的空elemen。或者你可以完全拋棄該財產。或者甚至可能是某個屬性:'isEmpty =「true」'。 – svick

+1

實際上有另一個很好的解決方案來表示'null'('xsi:nil =「true」'),看到這個:http://stackoverflow.com/questions/774192/what-is-the-correct-way-to -represent空的XML元素。 –