Ссылка на исключение необъявленной сущности при работе с XML

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

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

Это вызывает исключение:

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

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


person Rob    schedule 11.11.2008    source источник


Ответы (9)


XML, в отличие от HTML, не определяет объекты (т.е. именованные ссылки на символы UNICODE), поэтому и т. Д. Не преобразуются в соответствующий им символ. Вместо этого вы должны использовать числовое значение. Можно использовать только и в XML

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

person Stephan Leclercq    schedule 11.11.2008
comment
HtmlDocument происходит из пространства имен System.Windows.Forms j.mp/pSmv82 Если вам не нравится его тесная связь с элементом управления WebBrowser или который вызывает проблемы в вашем приложении, чистый HTML-анализатор доступен через HTML Agility Pack htmlagilitypack.codeplex.com/wikipage?title=Examples - person John K; 04.08.2011

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

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

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

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

Сделайте Google на "сущностях символов HTML" для определений сущностей.

person LandedGently    schedule 09.05.2009

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

  &#913;
person FlySwat    schedule 11.11.2008

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

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
person Fernando Miguélez    schedule 11.11.2008
comment
Подробнее о том, как подать заявку: azurator.blogspot.be/2012 /03/parsing-html-into-xelement.html - person Grimace of Despair; 18.03.2016

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

person verbedr    schedule 28.02.2014

Вариант решения, описанного на странице https://stackoverflow.com/a/842836/15178054: объявить объекты в отдельный файл, а затем укажите ссылку на этот файл из подмножества объявлений XML. Вот пример того, как использовать объекты HTML в таблице стилей XSLT.

<!DOCTYPE xsl:stylesheet
[
<!ENTITY % htmlentities SYSTEM "html-entity-list.ent">
%htmlentities;
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"...>

Внешний файл с сущностями - html-entity-list.ent. Я создал его из https://html.spec.whatwg.org/entities.json. Пример записи в сгенерированном файле:

<!ENTITY Auml "Ä">
person Felix Sasaki    schedule 22.02.2021

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

person configurator    schedule 11.11.2008

Использование 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);
person Nick Josevski    schedule 17.02.2010

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

person dret    schedule 04.01.2016