2009-02-13 73 views
2

好吧,我正在使用StreamReader從流中讀取數據。流內的數據不是xml,它可以是任何東西。編碼CDATA元素的有效方法

基於輸入StreamReader,我正在使用XmlTextWriter寫入輸出流。基本上,當所有事情都說完之後,輸出流包含來自包含在父元素中包含的元素中的輸入流的數據。

我的問題是雙重的。數據以塊的形式從輸入流中讀取,StreamReader類返回char []。如果輸入流中的數據包含「]]>」,它需要跨兩個CDATA元素進行拆分。首先,如何在char數組中搜索「]]>」?第二,因爲我在閱讀塊,所以「]]>」子字符串可以分成兩個塊,所以我該如何解釋?

我大概可以將char []轉換爲字符串,並對其進行搜索替換。這將解決我的第一個問題。在每次讀取時,我還可以檢查最後一個字符是否爲「]」,以便在下一次讀取時,如果前兩個字符是「]>」,我將啓動一個新的CDATA部分。

這似乎很難看,因爲它涉及到將字符數組轉換爲字符串,這意味着要花時間複製數據,並消耗兩倍的內存。有沒有更高效的方法,既有速度又有記憶力?

+0

我已經刪除了我的答案,因爲我決定我不知道XmlTextWriter如何工作。文件沒有說我預期他們會。 – 2009-02-13 06:13:47

回答

0

秒,因爲我在讀大塊,「]]>」子字符串可以分成兩個塊,所以我該如何解釋?

事實上,您必須將最後兩個字符保留在隊列中,而不是立即將它們吐出。然後,當新輸入進來時,將它追加到隊列中,並再次取除除最後兩個字符以外的所有字符,搜索並替換它們並輸出。

更好:根本不用打擾CDATA部分。他們只是爲了方便手工創作。如果您已經在進行搜索和替換,那麼沒有理由不應該僅僅使用它們的預定義實體搜索並替換'<','>'和'&',並將它們包括在正常的文本節點中。由於這些是簡單的單字符替換,因此您不必擔心緩衝。但是,如果您正在使用XmlTextWriter,就像爲每個傳入文本塊調用WriteString()一樣簡單。

4

根據HOWTO Avoid Being Called a Bozo When Producing XML

Don’t bother with CDATA sections

XML提供逃逸 標記,顯著字符的方式有兩種: 預定義的實體和CDATA 部分。 CDATA部分只有 句法糖。這兩個替代 句法結構沒有語義 的區別。

CDATA部分是方便,當你 手動編輯XML和需要 貼一大塊文本 包括標記,顯著字符 (如代碼示例)。但是,當 使用串行器產生XML時, 串行器負責自動轉義 並嘗試到 微操作轉義的選擇 方法只會爲 錯誤打開可能性。
...
只有<,>,&和(屬性值)「需要轉義。

只要小集合的特殊字符進行編碼/逃脫它應該只是工作。

不管你有處理自己逃跑是另一回事,但肯定是一個更直接求解的問題。

然後,只需追加一大堆的子文本節點相關的XML元素。

+0

這使得它很容易。謝謝。 – 2009-05-26 20:04:30

1

我知道的正好有兩個真正的用例CDATA:

一個是含XHTML文檔腳本:

<script type="text/javascript"> 
<![CDATA[ 
    function foo() 
    { 
     alert("You don't want <this> text escaped."); 
    } 
]]> 
</script> 

另一種是在文本中包含嵌入標記手工創作的XML文檔,例如:

<p> 
    A typical XML element looks like this: 
</p> 
<p> 
    <pre> 
    <![CDATA[ 
     <sample> 
     <text> 
      I'm using CDATA here so that I don't have to manually escape 
      all of the special characters in this example. 
     </text> 
     </sample> 
    ]]> 
    </pre> 
</p> 

在其他情況下,只需讓DOM(或XmlWriter的,或任何工具,你用創建XML)逃離文本節點的工作就好了。

+0

避免在腳本週圍需要CDATA節的一個好方法是使用JavaScript字符串文字轉義:alert(「您不希望\ x3Cthis \ x3E文本轉義。」); – bobince 2009-02-24 00:58:42

相關問題