2013-10-29 40 views
1

我有一個XML模式已發佈給用戶。它有一個相當複雜的結構,但它也有一些通用的元素,允許我們添加其他數據而不破壞發佈的結構。XML爲什麼要有結構?

例子:

<record> 
    <song> 
     <name>thriller</name> 
     <artist>Mike</artist> 
     <genericData key="year">1980</genericData> 
     <genericData key="duration">03:35</genericData> 
    </song> 
</record> 

所以在這裏我增加了對今年和持續時間2個genericData元素。

我們被要求在我們的結構中添加更多的數據,並且可以使用這些genericData元素來滿足這些需求,但是這樣做的缺點是什麼?我知道它並沒有保持數據的關係模型(這很糟糕),但是還有什麼東西會回來咬我們嗎?它對我來說有一種難聞的氣味。我寧願爲新數據添加特定的元素,但會改變我們的模式。

回答

0

我想說,在JSON或YAML等相當淺的格式上使用XML的唯一有力的理由是XML的模式定義和實例驗證功能。儘管Play Framework的JSON功能有例外,但您通常無法在這些較輕的格式上實施架構。事實上,根據使用情況,這很容易被視爲一個加號。這是「無模式」NoSQL數據庫的賣點之一。

如果您放寬您的XML以至於模式幾乎是偶然的,那麼根據您的使用情況,這可能是完全合法的。但是,如果是這樣,你就失去了使用XML唯一有說服力的理由。

我會建議確保您的「例外」通用數據的情況是非常罕見的。放鬆你必須抵制的規則將是一種自然的傾向。但是,如果經過仔細考慮,您認爲架構過於嚴格,那麼我會建議完全放棄XML。只要知道你將會把負擔轉移給你的團隊來處理邏輯,而這些邏輯可以從XML中直接獲得。

+0

+1爲務實的建議。 – groverboy

+1

我強烈反對。 XML被髮明來處理半結構化數據,這就是它的優勢所在。 –

+0

即使屬實,您的觀點也不相關,因爲「半結構化數據」是指混合內容,這與OP描述的內容不同。其次,我表達了我的回答。根據堆棧溢出的規則,因爲你「非常不同意」而不是隻是寵愛;它違反了規則:http://stackoverflow.com/help/privileges/vote-down – Vidya

1

XML中常見「genericData」設計模式,但在我看來,它很少是最好的解決方案。我認爲人們使用它的一個原因是當他們使用數據綁定工具(如JAXB)時:它們將XML映射到像Java這樣的語言的數據結構,像Java這樣的語言無法像XML那樣處理靈活性。如果沒有數據綁定的限制(例如,如果您使用專爲工作而設計的工具(如XSLT和XQuery)來處理XML,那麼我會利用XML的內置靈活性(無需架構或在架構中使用通配符),也許用名稱空間來添加一個規範控制級別:所以

<record> 
    <song> 
     <name>thriller</name> 
     <artist>Mike</artist> 
     <m:year xmlns:m="http://me.com/ns">1980</m:year> 
     <m:duration xmlns:m="http://me.com/ns">03:35</m:duration> 
    </song> 
</record> 
+0

*設計模式*是一個過度使用的術語,使事情聽起來宏偉。設計模式與「人們做很多事情」不一樣。特別是在這種情況下,當它是一個壞主意時,你甚至會注意到。另外,當人們放鬆規則時,OP並不考慮數據綁定到OO語言。這是因爲他們認爲,對於他們想要涵蓋的每個最後使用案例而言,架構過於嚴格,而放鬆則是一種誘人的方法,即使是短視的解決方案。最後,綁定可以很好地發生 - 用Java中的Map來說吧 – Vidya

+0

儘管我確實很想嘗試,因爲你應該放鬆你的業務規則以符合與OO語言感知的阻抗不匹配。切勿改變您的業務規則以符合技術。 – Vidya

+0

這兩種表示法()都要求放寬或擴展模式以適應擴展。兩者都實施相同的業務規則。所以我認爲使用前者的唯一情況是如果它使處理更容易。我不建議任何人使用數據綁定工具,但有些人會這樣做,如果沿着這條路線走,你可能會發現你扭曲了XML表示(而不是業務規則!),以使它們運行良好。 –

相關問題