2009-04-21 144 views
139

我看到若干方式表示null元素:什麼是表示空XML元素的正確方法?

的元素存在與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是人爲設計的,所以不要讀得太多。 :)

回答

98

的xsi:零是表示使得一個值的正確方法: 當DOM 2級呼叫getElementValue()被髮出,則返回NULL值。 xsi:nil也用於指示沒有內容的有效元素,即使該元素的內容類型通常不允許空元素。

如果使用空標籤,getElementValue()返回空字符串(「」) 如果標籤被省略,則不存在作者標籤。這可能在語義上與將其設置爲'nil'不同(例如,將「系列」設置爲零可能是該書不屬於系列,而省略系列可能意味着該系列對當前元素不適用)可能在語義上不同。

來自:The W3C

XML模式:結構引入了 機構,用於發信號通知一個 元件應該被接受作爲·有效· 當它具有儘管 內容類型沒有內容,其不需要或 甚至必須允許空的內容。 如果一個元素的屬性爲 xsi:nil,其值爲true,則該元素可能是有效的,不含 內容。如此標記的 元素必須爲空,但如果允許使用 對應的複雜類型,則 可以攜帶屬性。

一個澄清:
如果你有一本書的XML元素和子元素之一是書:系列產品在您填寫的時候出來幾個選項:

  1. 完全刪除元素 - 這可以當你希望表明該系列文章不適用於本書或該書不是系列文章的一部分時,可以這樣做。在這種情況下,具有與book匹配的模板的xsl變換(或其他基於事件的處理器)將不會被調用。例如,如果您的xsl將book元素轉換爲表格行(xhtml:tr),則可能會使用此方法獲取不正確的表格單元格數量(xhtml:td)。
  2. 將元素留空 - 這可能表示該系列爲「」或未知,或者該書不是系列的一部分。任何符合book:series的xsl轉換(或其他基於解析器的)都將被調用。 current()的值將是「」。您將使用此方法獲得與下一個描述相同數量的xhtml:td標籤。
  3. 使用xsi:nil =「true」 - 這表示book:series元素爲NULL,而不僅僅是空的。您的xsl轉換(或其他基於事件的解析器)將被調用,其中包含與book:series匹配的模板。 current()的值將爲空(非空字符串)。該方法與(2)的主要區別在於book:series的模式類型不需要允許空字符串(「」)作爲有效值。這對於一個系列元素來說沒有意義,但對於在模式中定義爲枚舉類型的語言元素,xsi:nil =「true」允許元素不含數據。另一個例子是十進制類型的元素。如果你希望它們是空的,你可以聯合一個只允許「」和一個小數的枚舉字符串,或者使用一個可以刪除的小數。
+11

使用XSI:無是正確的,但你應該確保它是正確的命名空間內:XMLNS :xsi =「http://www.w3.org/2001/XMLSchema-instance」 – STW 2009-05-01 01:42:50

+0

它實際上是`xmlns:xsi =「ht TP://w3.org/2001/XMLSchema-instance「`。請注意缺少的http://。這很重要,因爲命名空間字符串實際上只是xml解析器的一個字符串,而不是uri。 – 2015-01-01 21:30:51

+9

呵呵,我相信還是有點不對。它應該是`xmlns:xsi =「http://www.w3.org/2001/XMLSchema-instance」`。請注意「www。」。見http://www.w3.org/TR/xmlschema-1/#no-xsi – 2015-02-16 12:30:53

8

這取決於你如何驗證你的XML。如果使用XML Schema驗證,則表示null值的正確方法是使用xsi:nil屬性。

[Source]

2

在許多情況下,Null值的用途是服務於以前版本的應用程序中沒有的數據值。

所以說,你從你的應用「ReportMaster」第1版。

有一個XML文件,現在ReportMaster 2版本中一些屬性被添加可能會或不會被定義。

如果您使用'no tag means null'表示,您將自動獲得向後兼容性,以便讀取ReportMaster 1 xml文件。

4

如果模式語義指示元素具有默認值,並且在元素不存在時應使用默認值,則使用xsi:nil。我不得不假設,有些聰明的人前面的句子不是一個明顯可怕的想法,但對我來說聽起來像九種不好。我曾經使用的每種XML格式都通過省略元素來表示空值。 (或屬性,祝你好運,用xsi:nil標記屬性。)

4

簡單地忽略該屬性或元素在較不正式的數據中工作良好。

如果您需要更復雜的信息時,GML模式添加屬性nilReason,例如:在GeoSciML

  • xsi:nil與「真」的值被用來表示沒有可用的值
  • 可以使用nilReason來記錄缺失值的附加信息;這可能是標準的GML原因之一(missing, inapplicable, withheld, unknown)或other:前綴的文本,或者可能是更詳細解釋的URI鏈接。

當你交換數據,XML通常用於這方面的作用,發送給一個收件人或給定的目的可能有內容的數據掩蓋了將提供給別人誰支付或有不同的認證。瞭解內容丟失的原因可能非常重要。科學家們也在關心爲什麼信息不見了。例如,如果由於質量原因而被刪除,他們可能希望看到原始的不良數據。

9

沒有規範的答案,因爲XML從根本上沒有空的概念。 但我想你想Xml /對象映射(因爲對象圖有空);所以你的答案是「無論你的工具使用什麼」。如果你寫處理,那意味着你喜歡什麼。對於使用XML Schema的工具,xsi:nil是可行的方法。對於大多數映射器來說,省略匹配元素​​/屬性是實現它的方法。

5

在W3鏈接

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

文檔說,這是recomended形式。

<test></test> 
<test/> 

在另一個答案中提到的屬性是驗證機制,而不是狀態的表示。請參閱http://www.w3.org/TR/xmlschema-1/#xsi_nil

XML模式:結構引入了機制,信令的 元素不應被當作·有效·當它具有儘管不需要,甚至不一定是 內容類型沒有內容允許空 內容。如果元素的 屬性xsi:nil的值爲true,則元素可以是無效的。 如此標記的元素必須是 空,但可以攜帶屬性(如果相應的 複雜類型允許)。

要弄清這個答案: 內容

<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> 
相關問題