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

StackOverflow https://stackoverflow.com/questions/281682

  •  07-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь установить 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 &alpha;");

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

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

Выполните поиск в Google по " для определения сущности.

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

  &#913;

Предыдущий ответ правильный. Другая альтернатива - связать ваш 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, которые хотят использовать эти именованные объекты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top