2009-12-18 117 views
2

我知道,語法是有效的,但我的問題是,它是否在邏輯上是有效的:這是有效的XML嗎?

<parent> 
    <name>John</name> 
    <child>Mary</child> 
    <child>Lucy</child> 
    <child>Hannah</child> 
</parent> 

或做這個正確的方法是:

<parent> 
    <name>John</name> 
    <child> 
     <name>Mary</name> 
    </child> 
    <child> 
     <name>Lucy</name> 
    </child> 
    <child> 
     <name>Hannah</name> 
    </child> 
</parent> 

有一些文檔在線那肯定說什麼是對的和錯的?

+4

在線或其他地方沒有定義任何隨機XML文檔的語義的文檔。也沒有一種「正確」的方式來做到這一點。這一切都取決於存儲的具體數據,未來的擴展性要求,預期的典型處理等。 – 2009-12-18 16:50:58

+0

@Pavel,你爲什麼不把它寫成答案?我一定會對它投票。 – 2009-12-18 17:52:12

回答

1

值得一提的是,術語「有效」在XML中具有特定的含義。

當且僅當符合其DTD或模式的XML文檔纔有效。基本上,文本字符串的範圍被分成兩類:那些是格式良好的XML,而不是那些。格式良好的XML文檔的範圍也分爲三類:有效的XML文檔(符合其DTD /模式),無效的XML文檔(不符合),以及無法確定其有效性的文檔(因爲它們不符合「沒有DTD /模式)。

就您的實際問題而言,您只能根據其適用的目的來判斷XML文檔的設計。你會用XSLT來改變它嗎?用XPath查詢它?使用Linq-to-XML處理它?用SAX閱讀器處理它?將其中的數據反序列化爲對象?在記事本中編輯它?根據模式驗證它?通過慢速網絡傳輸它?所有這些東西(還有更多)都會影響XML的設計。沒有一個正確的答案。

5

這取決於你將如何處理它。如果您有機會在將來需要存儲更多關於每個人的數據,第二個版本會更好。

+1

所以,你是說這兩種方式都是有效的,但第二應該是首選? – 2009-12-18 16:50:22

+0

如果您的數據存儲需求不會改變,那麼第一個選項可以正常工作。第二個選項更加靈活,所以它可能會更好,因爲您的數據在將來幾乎總是需要更改。 – David 2009-12-18 17:05:06

15

我更喜歡後者,因爲它清楚地表明它是瑪麗的孩子的名字,而不是瑪麗的孩子本身。

我認爲,使用屬性,甚至更好,就像這樣:

<parent name="John"> 
    <child name="Mary" /> 
    <child name="Lucy" /> 
    <child name="Hannah" /> 
</parent> 

,因爲它清楚地表明,該名稱是父/子實體的只是一個特性。

+1

我更喜歡這個,因爲否則父母的名字與他們的孩子具有相同的邏輯權重。 – Skilldrick 2009-12-18 16:48:35

+3

+1,用於暗示使XML更臃腫:) – OregonGhost 2009-12-18 16:49:06

+0

我已經看到過去在某些應用程序中解析XML,而不像元素沒有文本節點。他們認爲它是非標準的(我認爲SAP就是這樣 - 我不知道它是否仍然存在),所以如果沒有文本節點的重要元素有時可以被視爲空標籤,即使它具有屬性。所以這個解決方案使得XML不那麼臃腫,但可能不適合所有情況。 – Yishai 2009-12-18 16:51:48

2

第二個是可取的。這表明,name是一個孩子的財產,並沒有識別孩子iteself。在類的術語它

想:

class Parent { 
    string Name; 
    List<Child> Children; 
} 

class Child { 
    string Name; 
} 

最好

class Parent { 
    string Name; 
    List<string> Children; 
} 

第二個選項也爲您提供了靈活性,在將來擴展(加生日元素,例如)。

更主觀爭論是是否使用元件或像name性能屬性等

最後,添加一個children元件與包含在那裏的child元件。

6

從擴展性的角度來看,第二個似乎更有意義。如果您需要爲第一個孩子添加生日,會發生什麼?是的,你可以添加一個XML屬性,但遲早你會因爲添加一個複雜類型甚至基本枚舉而停滯不前。

而且 - 這可能是一個「孩子」元素下更好地組子元素:

<parent> 
    <name>John</name> 
    <children> 
     <child> 
     <name>Mary</name> 
     <dob>1970-01-01</dob> 
     </child> 
     <child> 
     <name>Lucy</name> 
     <dob>1971-01-01</dob> 
     </child> 
     <child> 
     <name>Hannah</name> 
     <dob>1974-01-01</dob> 
     </child> 
    <children> 
</parent> 

一兩件事:你可能不會組一個單親元素下的孩子,但我已經離開了你的原版。

+0

我不會因爲沒有用ISO8602格式表示你的日期而讓你失望,但我應該。 – 2009-12-18 18:40:30

+0

我在想那個,但不能打擾。真實的故事。 – 2009-12-18 18:46:37

+0

編輯爲符合羅伯特。 ;-) – 2009-12-18 18:50:38

1

這是XML,沒有對錯。你的答案都是正確的,但這同樣有效:

<parent> 
    <name>John</name> 
    <children> 
    <child>Mary</child> 
    <child>Lucy</child> 
    <child>Hannah</child> 
    </children> 
</parent> 

你應該選擇哪種方式?這取決於任務。我認爲所提出的任何方式都不是最靈活的(如果孩子有孩子呢?)

2

當然,這個問題沒有正確的答案,但是如果孩子比單個字符串更復雜(或者可能變得更復雜),那麼第二個選項是可取的。

就你通常看到的情況而言,通常在任何情況下,所有的子元素都將被分組到子元素下。在某些可視化環境中,它可以幫助關閉所有的孩子,而其他元素保持焦點。

1

兩者都是對的。沒有關於如何構建元素的定義 - 完全取決於您!

有些人試圖減少節點的數量。而那些人,也許會創建XML像

<parent name="John"> 
    <child name="Mary" /> 
    <child name="Lucy" /> 
    <child name="Hannah" /> 
</parent> 

但是關於XML的線索是,你應該總是讓它爲伊斯利地閱讀和理解,爲人類beeings。擰上comupters,他們會一直了解你的XML,所以讓它成爲人類可讀的!因爲我喜歡孩子這實際上是孩子們的「設置」

<parent name="John"> 
    <children> 
    <child name="Mary" /> 
    <child name="Lucy" /> 
    <child name="Hannah" /> 
    </children> 
</parent> 

+0

屬性是XML信息集中的一個節點。 – 2009-12-18 17:21:18

2

我會用祥子和丹丹或維姆Hollebrandse之間的替代品。

1

對於如何將數據映射到XML模式沒有標準。有一些常見的做法,其中之一是使用striped XML,所以嵌套元素採取型/關係/型/關係的角色交替:

<!-- striped style, RDF etc --> 
<person> 
    <name>John</name> 
    <children> 
     <person> 
      <name>Mary</name> 
     </person> 
     <person> 
      <name>Lucy</name> 
     </person> 
     <person> 
      <name>Hannah</name> 
     </person> 
    <children> 
</parent> 

這是非常有規律的,但有些冗長。

它通常是一個壞主意,把人類可讀的文本屬性,以節省空間:

<person name="fred"/> 

作爲該排除使用ruby mark up所必需的某些形式的國際化,以及更加複雜的渲染使用CSS。如果您只關注緊湊型表示和ASCII文本,則XML可能不是要使用的最佳格式。