2016-03-04 63 views
2

由於我們知道CDATA不能嵌套,所以我喜歡使用Using CDATA inside another CDATA中提供的解決方案,該解決方案將]]>替換爲]]]]><![CDATA[>任何與相鄰CDATA相關的標準?

因此

<Root> 
    <![CDATA[ 
     <AAA> 
      <![CDATA[ 
       <BBB>hello world</BBB> 
      ]]> 
     </AAA> 
    ]]> 
</Root> 

變得

<Root> 
    <![CDATA[ 
     <AAA> 
      <![CDATA[ 
       <BBB>hello world</BBB> 
      ]]]]><![CDATA[> 
     </AAA> 
    ]]> 
</Root> 

的XML是我的API,這將通過其他程序不我的控制下使用的響應。

對於.NET,我的實驗顯示InnerText可以在所有CDATA部分中輸出文本。

var Root= doc.SelectNode("/Root"); 
var cdata = Root.InnerText; 

CDATA是

<AAA> 
    <![CDATA[ 
     <BBB>hello world</BBB> 
    ]]> 
</AAA> 

是否.NET的行爲符合什麼標準?是否有任何標準說明如何處理相鄰的CDATA?如果我的API返回相鄰的CDATA,其他程序或編程語言是否有問題處理呢?

回答

2

此行爲完全符合標準,應該在任何XML處理器中產生相同的結果。 CDATA部分可用於在任何地方轉義任何字符數據(除了在另一個CDATA部分中),並且您可以根據需要使用它們中的任意一個,無論是否相鄰。來自specification

定義:CDATA部分可能出現在任何可能出現字符數據的地方;它們用於轉義包含字符的文本塊,否則這些字符會被識別爲標記。

+0

我找不到InnerText的定義,可能規範使用另一個詞,我不知道。什麼是元素的InnerText,它是所有CDATA節中的文本?相鄰的CDATA部分是否被視爲一個? – Gqqnbig

+0

InnerText是給定元素內的字符數據(https://www.w3.org/TR/REC-xml/#dt-chardata)的.NET等效項。這些字符數據的每個部分都可以用CDATA轉義。其中:當你調用InnerText時,NET將會失敗。在最大轉角情況下,您可以將每個字符放在自己的CDATA部分中。在其他(通常)角落案例中,您不使用任何CDATA轉義。如果CDATA部分相鄰或不相關。 CDATA部分中的文本不會被進一步解釋(這是CDATA轉義的全部要點,以保護XML解釋中的文本) – TToni

+0

此外,https://dom.spec.whatwg.org/#interface-text表示'text .wholeText ' 返回所有直接文本節點同胞的**組合數據**。 – Gqqnbig