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