2014-01-31 46 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声明实际上是编码,这是问题。它不需要编码。 –