Проблема с XML - удаляется HTML внутри узла (ASP.NET C # LINQ to XML) - PullRequest
0 голосов
/ 10 мая 2011

Когда я загружаю этот узел XML, HTML внутри узла полностью удаляется.

Это код, который я использую для получения значения в узле, которое представляет собой текст в сочетании с HTML:

var stuff = innerXml.Descendants("root").Elements("details").FirstOrDefault().Value;

Внутри узла "details" находится текст, который выглядит следующим образом:

"This is <strong>test copy</strong>. This is <a href="#">A Link</a>"

Когда я смотрю в "stuff" var, я вижу это:

"This is test copy. This is A Link". There is no HTML in the output... it is pulled out.

Может быть, значение должно быть innerXml или innerHtml?FirstOrDefault () имеет какое-либо отношение к этому?

Я не думаю, что xml нуждается в блоке "cdata" ...

Вот более полный фрагмент кода:

 announcements =
                from link in xdoc.Descendants(textContainer).Elements(textElement)
                where link.Parent.Attribute("id").Value == Announcement.NodeId
                select new AnnouncmentXml
                {
                    NodeId = link.Attribute("id").Value,
                    InnerXml = link.Value
                };

XDocument innerXml;
innerXml = XDocument.Parse(item.InnerXml);
var abstract = innerXml.Descendants("root").Elements("abstract").FirstOrDefault().Value;

Наконец, вотфрагмент Xml-узла.Обратите внимание, что в стандартной структуре xml есть «InnerXml».Это начинается с.Я называю это «InnerXml», и это то, что я передаю в XDocument под названием InnerXml:

 <text id="T_403080"><root> <title>How do I do stuff?</title> <details> Look Here <a href="http://" target=" _blank">Some Form</a>. Please note that lorem ipsum dlor sit amet.</details> </root></text> 

[ОБНОВЛЕНИЕ]

Я попытался использовать эту вспомогательную лямду, и она вернетсяHTML, но он экранирован, поэтому, когда он отображается на странице, я вижу фактический HTML в представлении (вместо ссылки вместо ссылки отображается тег:

Title = innerXml.Descendants("root").Elements("title").FirstOrDefault().Nodes().Aggregate(new System.Text.StringBuilder(), (sb, node) => sb.Append(node.ToString()), sb => sb.ToString());

Поэтому я попыталсяи HTMLEncode, и HTMLDecode, но ни один из них не помог. Один из них отображал экранированные символы на экране, а другой ничего не делал:

Title = 
                        System.Web.HttpContext.Current.Server.HtmlDecode(
                            innerXml.Descendants("root").Elements("details").Nodes().Aggregate(new System.Text.StringBuilder(), (sb, node) => sb.Append(node.ToString()), sb => sb.ToString())
                        );

Ответы [ 2 ]

1 голос
/ 13 мая 2011

В итоге я использовал XmlDocument вместо XDocument.Не похоже, что LINQ to XML достаточно развиты, чтобы поддерживать то, что я пытаюсь сделать.Это не свойство InnerXml XDoc, только Value.

Возможно, когда-нибудь я смогу вернуться к LINQ.Сейчас мне просто нужно было снять это с моей тарелки.Вот мое решение:

// XmlDoc to hold custom Xml within each node
        XmlDocument innerXml = new XmlDocument();
        try
        {
            // Parse inner xml of each item and create objects
            foreach (var faq in faqs)
            {
                innerXml.LoadXml(faq.InnerXml);

                FAQ oFaq = new FAQ();

                #region Fields
                // Get Title value if node exists and is not null
                if (innerXml.SelectSingleNode("root/title") != null)
                {
                    oFaq.Title = innerXml.SelectSingleNode("root/title").InnerXml;
                }

                // Get Details value if node exists and is not null
                if (innerXml.SelectSingleNode("root/details") != null)
                {
                    oFaq.Description = innerXml.SelectSingleNode("root/details").InnerXml;
                }
                #endregion

                result.Add(oFaq);
            }
        }
        catch (Exception ex)
        {
            // Handle Exception
        } 
1 голос
/ 10 мая 2011

Я думаю, что оборачивать ваш узел данных в блок cdata - правильное решение.CData в основном указывает на то, что содержащаяся в нем информация должна рассматриваться как текст, а не анализироваться на наличие специальных символов XML.HTML-символы в узле сведений, особенно <и>, находятся в прямом конфликте со спецификацией XML и должны быть действительно помечены как текст.

Возможно, вам удастся обойти это, захватив innerXml, но если вы контролируете содержимое документа, cdata - правильное решение.

Если вам нужен пример того, как это должно выглядеть, вот модифицированная версия узла сведений:

<details>
    <![CDATA[
         This is <strong>test copy</strong>. This is <a href="#">A Link</a>
    ]]>
</details>
...