2012-07-27 64 views
0

我得到一個'xml'字符串,其中包含一些未轉義的內容。下面是一個簡單的例子:如何在原始字符串中轉義xml內容?

<link text="This is some text with "potentially" some quoted text in it." linktype="external" anchor="" target="" /> 

我的問題是,當你嘗試上述轉換爲使用XmlDocument.LoadXml()字符串,LoadXml()拋出由於缺乏逃避對所持內容的內部報價異常屬性'文本'。有沒有一種相對無痛的方式來具體逃避內容?或者我只是要解析它/自己逃脫/重建它?

我不會產生這樣的文字,我剛從另一個進程得到它在這樣的字符串:

"<link text="This is some text with "potentially" some quoted text in it." linktype="external" anchor="" target="" />" 
+0

我會看到有關獲取任何生成XML的信息以首先生成_compliant_ XML。這不是你應該處理的事情。 – 2012-07-27 20:47:29

回答

1

您需要使用HTML字符編碼,其中"&quot;

但你的輸入是你必須找到一種方法來解析文本,並與它們的編碼轉換更換引號中的格式不正確的XML文本。也許一些正則表達式解析..

請考慮這只是一個創造性的方式來完成這項工作。我知道這是骯髒的,但在大多數情況下工作:

private static string XmlEncodeQuotes(string target) { 

     string result = string.Empty; 
     for (int i = 0; i < target.Length; i++) 
     { 
      if (target[i] == '"') 
      { 
       if (target[i - 1] != '=') 
        if (!Regex.IsMatch(target.Substring(i), @"^""\s[a-zA-Z]+=""")) 
        { 
         result += "&quot;"; 
         continue; 
        } 
      } 
      result += target[i]; 
     } 
     return result; 
    } 
+0

是的,我希望有一種不那麼痛苦的方式來做到這一點內置.NET已經開始嘗試寫正則表達式的清理它... – 2012-07-27 20:32:53

+0

其實我認爲這是相當不可能的,否則,因爲如果你開始思考正則表達式,你會看到你需要大量的盲猜 – 2012-07-27 20:34:18

+0

這實際上是非常接近我需要的,只需做一個小的調整來處理正則表達式匹配一個空屬性的結尾引用(如:'id =「」' )。 – 2012-07-30 13:33:50

0

你嘗試過一個CDATA標籤內包裹的XML文檔的一部分?

+0

我不生成內容,所以我不能只更改生成上述字符串的過程,如果這就是你的意思。我從字面上得到上面的內容,就是這樣。 – 2012-07-27 20:27:52

0

威爾System.Security.SecurityElement.Escape()爲你工作?如果沒有,那麼還有一個XmlTextWriter。

+0

我不是downvoting,但不是!不起作用!它只會翻譯任何「無效」字符 – 2012-07-27 20:45:33

+0

好的,我重讀了它,並且我認爲您正在尋找將您收到的值寫入不同的XML文件,但是如果您想分析它並且它無效,那麼您可能需要自己解析它或者讓數據提供商向您發送正確轉義的XML片段,具體取決於您發送的片段範圍的限制程度(即,如果它們總是這種「鏈接」風格,那麼自解析很容易足夠)。 – 2012-07-27 20:48:49

0

如果你只是問如何逃生報價,這與

&quot; 

做我不知道你正在處理什麼用,但你的問題的根源是,該數據你收到的是畸形的。

  • 選項1)除非清理數據,否則很難讓大多數解析器加載無效的XML數據。有些人比其他人更寬容。你可能有一些運氣的HTML Agility Pack

  • 選項2)Use Regular Expressions to fix your XML.

  • 選項3)如果編碼解析方案是不是一種選擇使用XSLT。只需創建轉換,然後添加一個模板來解決問題。

相關問題