Как вставить текст при использовании XElement - PullRequest
14 голосов
/ 25 февраля 2009

Я использую новый System.Xml.Linq для создания документов HTML (да, я знаю о HtmlDocument, но очень предпочитаю классы XDocument / XElement). У меня проблема с вставкой   (или любой другой объект HTML). Что я уже пробовал:

  1. Простое вложение текста напрямую не работает, потому что & превращается в int &. new XElement("h1", "Text to keep together.");

  2. Я попытался выполнить синтаксический анализ в необработанном XML-файле, используя следующее, но это приводит к ошибке:

    XElement.Parse («Текст, чтобы держаться вместе».);

    -> Ссылка на необъявленную сущность 'nbsp'.

  3. Попытка номер три выглядит следующим образом. Если я сохраняю в файл, остается только пробел,   теряется.


var X = new XDocument(new XElement("Name", KeepTogether("Hi Mom!")));
private static XNode KeepTogether(string p)`
{
    return XElement.Parse("<xml>" + p.Replace(" ", "&#160;") + "</xml>").FirstNode;
}

Я не мог найти способ просто протолкнуть необработанный текст, чтобы он не сбежал. Я что-то упускаю из виду?

Ответы [ 8 ]

15 голосов
/ 26 февраля 2009

Я не смог найти способ протолкнуть необработанный текст без экранирования.

Просто поместите символ Unicode в этот & nbsp; ссылается на (U + 00A0 NO-BREAK SPACE) непосредственно в текстовом узле, а затем позволяет сериализатору беспокоиться о том, нужно ли ему экранировать или нет. (Вероятно, нет: если вы используете UTF-8 или ISO-8859-1 в качестве страницы, кодирующей символ, можно включить ее напрямую, не беспокоясь о том, чтобы кодировать ее в ссылку на сущность или ссылку на символ).

new XElement("h1", "Text\u00A0to\u00A0keep\u00A0together");
2 голосов
/ 26 августа 2010

Я знаю, что это старый, но я нашел кое-что, и я довольно удивлен!

XElement element = new XElement("name",new XCData("<br /> & etc"));

И вот, пожалуйста! Текст CDATA!

2 голосов
/ 20 октября 2009

Замена & на маркер типа ## AMP ## решила мою проблему. Возможно, не самое красивое решение, но я получил демо для клиента через 10 минут, так что ... мне все равно :)

Спасибо за идею

1 голос
/ 15 декабря 2011

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

& бык ... просто вставьте •

& Harr; ... просто вставьте 100

1 голос
/ 25 февраля 2009

В отличие от amp (&), lt (<) и т. Д., Nbsp не является известным объектом для XML, поэтому вам необходимо объявить его. Например, в XML & Хуг; обрабатывается как сущность, парсер будет ссылаться на его значение для получения вывода. </p>

// the xml, plz remove '.' within xml
string xml = "<xml>test&.n.b.s.p;test</xml>";

// declare nbsp as xml entity and its value is " " in this case.
string declareEntity = "<!DOCTYPE xml [<!ENTITY nbsp \" \">]>";

XElement x = XElement.Parse( declareEntity  + xml );
// output with a space between tests
// <xml>test test</xml>

или

 // plz remove '.' in the string 
 XElement.Parse("<xml>" + HttpUtility.HtmlEncode("Text&.n.b.s.p;keep everything") + "</xml>");
1 голос
/ 25 февраля 2009

Вы также можете попробовать использовать пронумерованные объекты, они не нуждаются в декларации. Нумерованный объект, эквивалентный названному объекту & nbsp; это

0 голосов
/ 28 февраля 2009

Я придумал этот слегка глупый подход, который меня устраивает: Строка заменяет все символы & ## AMP ## при сохранении данных .... И поменять эту операцию на выходе. Я использую это в сочетании со столбцом SQL XElement и работает удовольствие.

Привет

Neil

0 голосов
/ 26 февраля 2009
&amp;nbsp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...