2016-04-22 24 views
1

Atom提要解析器應如何處理XML的下面一行在飼料:解析Atom XML提要時,應如何處理衝突的CDATA和實體轉義元素?

<title type="html"><![CDATA[Johnson &amp; Johnson]]></title> 

爲了討論的緣故,讓我們假設最初預期的文本實際上Johnson & Johnson。我碰到這個online discussion來到這個問題,好像有2個不同的觀點:

  1. Opinion #1 - claims that this content is double-encoded。文本「約翰遜&約翰遜」文本已被實體轉義,然後通過包裝在CDATA節再次編碼。他指出,行爲良好的xml解析器將返回Johnson &amp; Johnson,因爲XML spec狀態應該如何處理CDATA編碼數據。

  2. Opinion #2 - claims that the Atom spec takes precedent。他指出CDATA是一種傳遞。 Johnson &amp; Johnson作爲Johnson &amp; Johnson出現。如果這只是一個XML文檔,它就會在那裏結束。但是,因爲它是Atom,我們必須查看Atom spec以確定正確的行爲。原子規範指出任何帶有type="html"的元素都包含實體轉義的html。因此,我們應該可以自由解碼它。

其中這些事實上是正確的?如果適當的Atom XML解析器產生: Johnson & JohnsonJohnson &amp; Johnson給出這種特殊情況?

回答

0

CDATA是字符數據 - 完全被解析器忽略。它必須是因爲XML不能處理&。因此,不存在「雙重編碼」 - 任何解析器跳到關閉標記,忽略其中的任何內容。我還沒有遇到過允許實際嵌套的解析器(嵌入式完整CDATA開放和關閉標籤)。

0

CDATA標記之間的內容未針對標記實體進行分析,因此文本節點的解析值爲Johnson &amp; Johnson

請注意,該屬性爲type="html",因此應該將其解析爲HTML。

例如如果你是在表達這樣一個網頁,你可能會這樣寫:

<h1>Johnson &amp; Johnson</h1> 

如果它說type="text"那麼你會需要純文本爲HTML它會給你編碼:

<h1>Johnson &amp;amp; Johnson</h1> 
+0

你的聲明「所以應該再被解析爲HTML」就是模糊進來我。如果Atom庫(通常用於'type =「html」'元素)在沒有CDATA的情況下對其元素的文本進行html解碼,那麼您是否聲明它也應該對包裝在CDATA中的元素文本進行html解碼? – mmcdole

+0

*如果Atom庫,通常爲type =「html」* - Atom庫不應該,HTML呈現器應該。 – Quentin

+0

當規範明確指出它們被轉義出來時,爲什麼Feed提取解析器庫不應該自己去標記爲'type =「html」'的元素?當您詢問Python的'feedparser'庫或PHP的'Simplepie'庫時,將其標題定義爲:'的標題返回爲'Title'。示例<p>標題</p > ',他們將全部返回'Example

title

'。這個問題圍繞着CDATA元素是否應該規避他們在將數據解析爲非轉義形式時所做的典型的解決方案。 – mmcdole

0

兩個意見是正確的:

  • 作爲文本編碼的標題是Johnson & Johnson
  • 編碼爲HTML的標題是Johnson &amp; Johnson
  • 在XML編碼爲HTML的標題是<![CDATA[Johnson &amp; Johnson]]>