如何从xelement中提取cdata的值?

时间:2014-01-31 05:41:17

标签: c# xml xml-parsing xelement

我有以下XML

<?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>

在尝试使用CDATA提取embeddedHTML的值的c#代码中。
我的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;
    }
}

从上面的代码中我可以提取embeddedHTMLexecutiveimgSRC的值,但embeddedHTML给出了

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

但我想要

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

请不要建议使用.Replace方法

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

看起来XML中的CData声明是用HTML的其余部分编码的。确保此XML的生产者具有非编码的CData声明,如<![CDATA[ encoded HTML content ]]>

否则,您拥有的代码看起来是正确的。使用Linq to XML读取CData需要做什么特别的事情。