Подтвердить что ты не робот

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

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

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

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

Ссылка на необъявленный объект 'alpha'. Строка 2, позиция 2..

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

4b9b3361

Ответ 1

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

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

Ответ 2

В .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 символьных сущностях" для определений сущностей.

Ответ 3

Попробуйте заменить & alpha; Alpha с помощью

  &#913;

Ответ 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