2014-01-31 89 views
2

我有以下XML如何從xelement中提取cdata的值?

<?xml version="1.0"?> 
<DisplayViewHtml> 
    <embeddedHTML>&lt;![CDATA[&lt;html&gt;&lt;body&gt;&lt;div&gt;Hello World&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;]]&gt;</embeddedHTML> 
    <executive>Madan Mishra</executive> 
    <imgSRC>/executive/2.jpg</imgSRC> 
</DisplayViewHtml> 

在C#代碼試圖提取的embeddedHTML與出CDATA值。
我的C#代碼如下給出,

XElement displayViewHtml=null; 
XmlReader reader = XmlReader.Create(new StringReader(e.Result)); 
displayViewHtml = XElement.Load(reader); 
IEnumerable<XElement> settings = from item in displayViewHtml.Elements() select item; 
foreach (XElement setting in settings) 
{ 
    switch (setting.Name.ToString()) 
    { 
     case "embeddedHTML": 
      counterViewHtml = setting.Value; 
      break; 
     case "executive": 
      executive = setting.Value; 
      break; 
     case "imgSRC": 
      imgSRC = setting.Value; 
      break; 
     default: 
      //log 
      break; 
    } 
} 

從上面的代碼,我能夠提取的embeddedHTMLexecutiveimgSRCembeddedHTML值的總和給出

<![CDATA[<html><body><div>Hello World</div></body></html>]]> 

,但我想

<html><body><div>Hello World</div></body></html> 

請不要使用.Replace方法

回答

2

正如@CamBruce建議的那樣,問題在於你的xml文件在他們不應該的地方編碼了字符。理想的解決方案是修復生成XML文件的程序。無論如何,如果您由於某種原因希望在這裏一個變通,這樣一來就可以了:上面

..... 
case "embeddedHTML": 
      var element = XElement.Parse("<embeddedHtml>" + 
              setting.Value + 
             "</embeddedHtml>"); 
      counterViewHtml = element.Value; 
      break; 
..... 

的代碼告訴程序通過解析字符串已經轉義創造新的XElement(變量element)。因此,新創建的XElement的值將包含您想要的字符串:

<html><body><div>Hello World</div></body></html> 
+0

因此,我不知道這種方法的任何問題,導致您取消標記此答案?在你回答之前,我已經以同樣的方式完成了 – har07

+0

。 – madan

0

它看起來像XML中的CData聲明是用HTML的其餘部分編碼的。確保此XML的生產者具有非編碼的CData聲明,如下所示:<![CDATA[ encoded HTML content ]]>

否則,您看起來正確的代碼。使用Linq to XML來讀取CData沒有什麼特別之處。

+0

謝謝@Cam Bruce。它的非編碼CData – madan

+0

CData聲明實際上是編碼,這是問題。它不需要編碼。 –