Сохраняйте HTML-теги в XML, используя LINQ to XML - PullRequest
5 голосов
/ 19 января 2009

У меня есть XML-файл, из которого я извлекаю HTML, используя LINQ to XML. Это образец файла:

<?xml version="1.0" encoding="utf-8" ?>
<tips>
    <tip id="0">
    This is the first tip.
</tip>
<tip id="1">
    Use <b>Windows Live Writer</b> or <b>Microsoft Word 2007</b> to create and publish content.
</tip>
<tip id="2">
    Enter a <b>url</b> into the box to automatically screenshot and index useful webpages.
</tip>
<tip id="3">
    Invite your <b>colleagues</b> to the site by entering their email addresses.  You can then share the content with them!
</tip>
</tips>

Я использую следующий запрос для извлечения подсказки из файла:

Tip tip = (from t in tipsXml.Descendants("tip")
                   where t.Attribute("id").Value == nextTipId.ToString()
                   select new Tip()
                   {
                     TipText= t.Value,
                     TipId = nextTipId
                   }).First();

У меня проблема в том, что элементы Html удаляются. Я надеялся использовать что-то вроде InnerHtml вместо Value, но этого, похоже, там нет.

Есть идеи?

Спасибо всем заранее,

Dave

Ответы [ 4 ]

8 голосов
/ 19 января 2009

Звоните t.ToString() вместо Value. Это вернет XML в виде строки. Вы можете использовать перегрузку, используя SaveOptions, чтобы отключить форматирование. Я не могу проверить прямо сейчас, но я подозреваю, что он будет включать тег элемента (и элементы), так что вам придется удалить это.

Обратите внимание, что если ваш HTML не является допустимым XML, вы в итоге получите неверный общий XML-файл.

Формат файла XML полностью вне вашего контроля? Было бы лучше, если бы любой внутренний HTML-код был закодирован в формате XML.

РЕДАКТИРОВАТЬ: Один из способов избежать получения внешней части может быть сделать что-то вроде этого (в отдельном методе, вызванном из вашего запроса, конечно):

StringBuilder builder = new StringBuilder();
foreach (XNode node in element.Nodes())
{
    builder.Append(node.ToString());
}

Таким образом, вы получите HTML-элементы с их потомками и вкрапленными текстовыми узлами. Я полагаю, что это эквивалент InnerXml.

1 голос
/ 24 февраля 2011

Просто используйте string.Concat(tip.Nodes()), чтобы получить контент с HTML-тегами

0 голосов
/ 25 января 2019

Просто используйте:

string.Concat(element.Nodes()) 

для получения содержимого с тегами HTML .

0 голосов
/ 19 января 2009

TipText = t.Value,

XElement.value возвращает только текст, который находится непосредственно внутри элемента. Текст во вложенных элементах - HTML или иным образом - не будет включен, и, конечно, любые ссылки & -entity будут отображаться в расшифрованном виде.

Если вы хотите, чтобы содержимое представляло собой строку с разметкой, вы можете вызвать XElement.ToString (), возможно, с помощью SaveOptions.DisableFormatting. Но обратите внимание, что это включает в себя обертывающий элемент , то есть в терминах DOM веб-браузера это externalHTML, а не innerHTML. Чтобы получить innerHTML, вам нужно объединить все ToString () дочерних XElement.Nodes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...