Ссылка на исключение необъявленной сущности при работе с XML
Вопрос
Я пытаюсь установить innerxml для xmldoc, но получаю исключение: ссылка на необъявленную сущность
XmlDocument xmldoc = new XmlDocument();
string text = "Hello, I am text α – —"
xmldoc.InnerXml = "<p>" + text + "</p>";
Это вызывает исключение:
Ссылка на необъявленную сущность 'альфа'. Строка 2, позиция 2 ..
Как бы я решил эту проблему?
Решение
XML, в отличие от HTML, не определяет сущности (то есть именованные ссылки на символы UNICODE), поэтому & amp; alpha; & Амп; mdash; и т. д. не переводятся в соответствующий им характер. Вместо этого вы должны использовать числовое значение. Вы можете использовать только & amp; lt; и & amp; в XML
Если вы хотите создать HTML, используйте вместо него HtmlDocument.
Другие советы
В .Net вы можете использовать класс System.Xml.XmlConvert
:
string text = XmlConvert.EncodeName("Hello α");
Кроме того, вы можете объявить объекты локально, поместив объявления в квадратных скобках в объявлении DOCTYPE. Добавьте следующий заголовок в ваш xml:
<!DOCTYPE documentElement[
<!ENTITY Alpha "Α">
<!ENTITY ndash "–">
<!ENTITY mdash "—">
]>
Выполните поиск в Google по
Попробуйте заменить & amp; Alpha на
Α
Предыдущий ответ правильный. Другая альтернатива - связать ваш HTML-документ с DTD, где определены эти символьные объекты, и это стандартное определение DTD XHTML. Ваш xml-файл должен содержать следующую декларацию:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
Вы также можете установить InnerText на " Здравствуйте, я текст & # 945; & # 8211; & # 8212; "
, заставляя XmlDocument автоматически их исключать. Я думаю.
Использование 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);
Используйте строку System.Net.WebUtility.HtmlDecode (string), которая будет декодировать все символы, закодированные в HTML-сущности, в ее вариант Unicode. Это доступно из dot.net framework 4
Если вы хотите использовать имена сущностей HTML, к которым вы привыкли, W3C предоставит вам информацию и подготовит «Определения сущностей XML для символов». http://www.w3.org/TR/xml-entity-names/, который по сути представляет собой список именованных сущностей, очень похожих на те, что есть в HTML. Но, как упомянуто выше, это не встроено в XML, и должно быть явно поддержано приложениями XML, которые хотят использовать эти именованные объекты.