2008-08-10 56 views
8

我產生了一些XML文件,當它涉及到地址部分我有看起來像這樣的片段:對XML文檔中的換行符敏感是否是「不好的做法」?

<Address>15 Sample St 
Example Bay 
Some Country</Address> 

,我有此轉換爲XHTML的XSLT有一些時髦的遞歸模板轉換換行符字符串內的字符到< br/>標籤。

這一切工作正常;但是依賴XML文檔中的換行符被認爲是「不好的做法」?如果是這樣,建議我這樣做嗎?

<Address><Line>15 Sample St</Line> 
<Line>Example Bay</Line> 
<Line>Some Country</Line></Address> 

好像它會非常尷尬來包裝每一個地方我的文字可能是多行有這樣的標籤..

回答

9

它通常被認爲是不好的做法依靠換行符,因爲它是區分數據的脆弱方式。雖然大多數XML處理器將保留您放入XML中的任何空白,但不能保證。

真正的問題是,將XML輸出爲可讀格式的大多數應用程序都會考慮XML中的所有空白可互換,並且可能會將這些換行符合併爲一個空格。這就是爲什麼你的XSLT必須跳過這些環節才能正確呈現數據。使用「br」標籤將大大簡化轉換。

另一個潛在的問題是,如果你在一個XML編輯器打開你的XML文檔,漂亮,打印,你可能會失去這些換行符。

如果確實使用換行符,請確保將xml:space =「preserve」屬性添加到「address」。 (你可以在你的DTD做到這一點,如果你使用一個)

一些建議閱讀

XML應用程序常常顯得采取 騎士對空格的態度 ,因爲關於 中的地方的規則是一個XML文檔,其中有空格 無所謂有時會給這些 應用程序自由添加或 刪除某些地方的空白。

-1

是的,我想用CDATA塊將保護空白。儘管一些解析器API允許您保留空白。

2

我認爲唯一真正的問題是它使XML難以閱讀。例如

<Something> 
    <Contains> 
     <An> 
      <Address>15 Sample St 
Example Bay 
Some Country</Address> 
     </An> 
    </Contains> 
</Something> 

如果漂亮的XML不是問題,我可能不會擔心它,只要它工作。如果漂亮的XML是一個問題,我會將明確的換行符轉換爲<br />標記或\n,然後再將它們嵌入到XML中。

1

這取決於你如何讀寫XML。

如果正在自動生成的XML - 如果換行或明確\ n標誌被解析成
- 再沒有什麼可擔心的。您的輸入可能沒有任何其他XML,因此它根本就不乾淨。

如果標籤正在與手工工作,它仍然是清潔的,只是有一個換行符,如果你問我。

唯一的例外是如果你使用DOM得到一些結構出了XML的。在這種情況下,換行符顯然是邪惡的,因爲它們不能正確表示層次結構。儘管這聽起來像是對你的應用程序而言是無關緊要的,所以換行符就足夠了。

如果XML只是很糟糕(尤其是當自動生成),Tidy可以幫助,但它與HTML優於使用XML。

-1

你真的應該做的是將你的XML轉換爲保留空格的格式。

因此,而不是尋求與<替換\ n BR/>你應該換整個塊在<預>

這樣一來,你的地址在功能上保留(是否包含換行符與否)和XSTL可以選擇是否在結果中保留空格。

-1

我建議您應該添加<br/>換行符或可能使用換行實體 - &#x000D;

0

我看不出有什麼不對<Line>標籤。
顯然,數據的可視化對您很重要,足夠重要,可以將其保存在數據中(通過第一個示例中的換行符)。精細。然後真的保留它,不要依靠「魔術」來爲你保留它。保留稍後需要的每一點數據,並且無法從保存的數據部分中完美地推斷出來,即使它是可視化數據(換行符和其他格式)也可以保留它。您的用戶(另一位開發人員的最終用戶)花時間根據自己的喜好對數據進行格式化,或者告訴他(您在輸入附近的API文檔/文本)您不打算保留它,或者 - 保留它。

-2

如果您需要換行符保存,使用一個CDATA塊,如tweakt said

否則當心。大多數情況下,換行符都會被XML軟件保留,但有時候不會,而且你真的不想依賴那些只能巧合運行的東西。

2

如何使用屬性來存儲數據,而不是文本節點:

<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/> 

我知道使用屬性與文本節點是一個經常辯論的主題,但我堅持屬性的95%的時間,而且還沒有任何麻煩,因爲的。

1

這可能是一個有點欺騙性的例子,因爲在這種情況下地址有點非標準化。這是一個合理的折衷,但是由於地址字段很難正常化。 如果您換行攜帶的重要信息,你是聯合國正常化,使郵局解釋的換行符的意思。

我要說的是,通常這不是一個大問題,但在這種情況下,我覺得線標記是最正確的,因爲它明確地表明,你實際上並不解釋什麼線可以在不同的文化意味。 (請記住,大多數輸入地址的表單都有郵政編碼等,地址行1和地址行2)。

讓行標記具有普通XML的尷尬,並且在編碼恐怖方面一直備受爭議。 http://www.codinghorror.com/blog/archives/001139.html

1

有關whitespacelinefeeds and carriage returns in particular的XML規範有話要說。所以如果你限制自己的真正的換行(x0A),你應該沒問題。然而,許多編輯工具將重新格式化XML爲「更好的表現」,並可能擺脫特殊語法。一個更強大和更簡潔的方法比「<線> < /線>」的想法是簡單地使用命名空間和嵌入XHTML內容,例如:

<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address> 

沒有必要重新發明輪子當談到標準詞彙。

3

很少人說,CDATA塊將允許您保留換行符。這是錯誤的。 CDATA節只會讓標記被處理爲字符數據,他們將變化換行符處理。

<Address>15 Sample St 
Example Bay 
Some Country</Address> 

是完全一樣的

<Address><![CDATA[15 Sample St 
Example Bay 
Some Country]]></Address> 

唯一的區別在於不同的API如何報告這一點。

相關問題