Как извлечь значение cdata из 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>

В коде С# пытаются извлечь значение embeddedHTML без CDATA.
Мой код С# приведен ниже,

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;
    }
}

из приведенного выше кода я могу извлечь значение embeddedHTML, executive и imgSRC, но embeddedHTML дает

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

но я хочу

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

пожалуйста, не предлагайте использовать метод .Replace


person madan    schedule 31.01.2014    source источник


Ответы (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>
person har07    schedule 31.01.2014
comment
Итак, какие-либо проблемы с этим подходом, о которых я не знаю, заставили вас снять отметку с этого ответа? - person har07; 31.01.2014

Похоже, что объявление CData в XML закодировано с остальной частью HTML. Убедитесь, что у производителя этого XML есть незакодированное объявление CData, подобное этому <![CDATA[ encoded HTML content ]]>

В противном случае код у вас выглядит правильно. Вам не нужно делать ничего особенного, чтобы читать CData с помощью Linq to XML.

person Cam Bruce    schedule 31.01.2014
comment
Объявление CData на самом деле закодировано, что является проблемой. Его не нужно кодировать. - person Cam Bruce; 31.01.2014