Ссылка на исключение необъявленной сущности при работе с XML - PullRequest
23 голосов
/ 11 ноября 2008

Я пытаюсь установить innerxml xmldoc, но получаю исключение: ссылка на необъявленную сущность

XmlDocument xmldoc = new XmlDocument();
string text = "Hello, I am text α   – —"
xmldoc.InnerXml = "<p>" + text + "</p>";

Это исключение:

Ссылка на необъявленную сущность 'альфа'. Строка 2, позиция 2 ..

Как бы я решил эту проблему?

Ответы [ 8 ]

26 голосов
/ 11 ноября 2008

XML, в отличие от HTML, не определяет сущности (то есть именованные ссылки на символы UNICODE), поэтому & alpha; & Mdash; и т. д. не переводятся в соответствующий им характер. Вместо этого вы должны использовать числовое значение. Вы можете использовать только & lt; и & amp; в XML

Если вы хотите создать HTML, используйте вместо него HtmlDocument.

13 голосов
/ 09 мая 2009

В .Net вы можете использовать класс System.Xml.XmlConvert:

string text = XmlConvert.EncodeName("Hello &alpha;");

Кроме того, вы можете объявить объекты локально, поместив объявления в квадратных скобках в объявлении DOCTYPE. Добавьте следующий заголовок в ваш xml:

<!DOCTYPE documentElement[
<!ENTITY Alpha "&#913;">
<!ENTITY ndash "&#8211;">
<!ENTITY mdash "&#8212;">
]>

Сделайте гугл по "html символьным сущностям" для определения сущностей.

6 голосов
/ 11 ноября 2008

Предыдущий ответ правильный. Другая альтернатива - связать ваш HTML-документ с DTD, где определены эти символьные объекты, и это стандартное определение DTD XHTML. Ваш xml-файл должен содержать следующую декларацию:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
6 голосов
/ 11 ноября 2008

Попробуйте заменить & Alpha на

  &#913;
0 голосов
/ 04 января 2016

Если вы хотите использовать имена HTML-сущностей, к которым вы привыкли, W3C предоставит вам информацию и создаст «Определения сущностей XML для символов» http://www.w3.org/TR/xml-entity-names/,, по сути, список именованных сущностей, очень похожих к тем, что имеет HTML. Но, как упоминалось выше, он не встроен в XML и должен явно поддерживаться приложениями XML, которые хотят использовать эти именованные объекты.

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

Используйте строку System.Net.WebUtility.HtmlDecode (строка), которая будет декодировать все символы, закодированные в HTML-сущности, в ее вариант Unicode. Доступно в dot.net framework 4

0 голосов
/ 18 февраля 2010

Использование HtmlDocument в моей ситуации не подходило, в нашей системе был пользовательский XmlUrlResolver, который мы использовали для загрузки xml.

//setup
public class CustomXmlResolver : XmlUrlResolver { /* ... */ }
String originalXml; //fetched xml with html entities in it

var doc = new XmlDocument();
doc.XmlResolver = new AdCastXmlResolver();

//making use of a transitional dtd
doc.LoadXml("<!DOCTYPE html SYSTEM \"xhtml1-transitional.dtd\" > " + originalXml);
0 голосов
/ 11 ноября 2008

Вы также можете установить InnerText на "Hello, I am text α – —", чтобы XmlDocument автоматически их исключал. Я думаю.

...