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

Специальные символы в XML

Я создаю левую навигационную систему, использующую xml и xsl. Все было здорово, пока я не попытался использовать специальный символ в своем XML-документе. Я использую », и я получаю ошибку.

Причина

: Ссылка на undefined entity 'raquo'.
код ошибки: -1072898046

Как мне сделать эту работу?

4b9b3361

Ответ 1

Вы пытаетесь использовать объект HTML в документе, отличном от HTML или не-XHTML. Эти объекты объявлены в документе Определение типа документа (DTD).

Вы должны использовать числовую версию Unicode ссылка на сущность. Например, в случае » вы должны использовать »

В качестве альтернативы вы можете определить их в DTD документа XML:

<!ENTITY entity-name "entity-value">
<!ENTITY raquo "&#187;">

В противном случае, если ваш документ UTF-8, я считаю, что вы можете просто использовать фактический символ непосредственно в своем XML-документе.

»

Ответ 2

Вы указали тип документа для своего файла?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Я думаю, вы можете получить такие ошибки, если не забыли указать его.

Также иногда сущности работают, если вы укажете их по номеру вместо имени.

&#187; &#171; instead of &raquo; and &laquo;

Ответ 3

Вам не нужно объявлять объект в DTD или даже использовать DTD. Вероятно, вам не нужно использовать представление символа Unicode. Вам определенно не нужно использовать раздел CDATA.

Что вам нужно сделать, так это использовать DOM для создания XML вместо того, чтобы пытаться построить его с помощью строковых манипуляций. DOM устранит эту проблему для вас.

В С# этот код:

 XmlDocument d = new XmlDocument();
 d.LoadXml("<foo/>");
 char c = (char)187;
 d.DocumentElement.InnerText = "Here that character: " + c;
 Debug.WriteLine(d.OuterXml);
 d.DocumentElement.InnerText = "Here it is as an HTML entity: &raquo;";
 Debug.WriteLine(d.OuterXml);

производит этот вывод:

<foo>Here that character: »</foo>
<foo>Here it is as an HTML entity: &amp;raquo;</foo>

Как вы можете видеть из первого примера, & raquo; персонаж совершенно легален в XML-тексте. Но я не думаю, что вы пытаетесь представить этого персонажа.

Я думаю, вы пытаетесь сделать то, что во втором примере, на основе сообщения об ошибке, о котором вы сообщали. Вы пытаетесь представить строку символов &raquo;. Правильный способ представления этой строки символов в тексте XML - это экранирование амперсанда; таким образом: &amp;raquo;.

Итак, если вы должны использовать строковые манипуляции для создания своего XML, просто убедитесь, что вы избегаете каких-либо амперсандов в ваших исходных данных. Не согласитесь с этим, но если вы использовали DOM, это было бы сделано для вас автоматически.

Еще одна вещь. Весьма вероятно, что в вашем первоначальном вопросе, который теперь читается "Я использую", вы написали "Я использую & raquo;". Фактическое сообщение не похоже на это. Если вам нужно представлять текст буквально в уценке, приложите его в обратные ссылки; в противном случае объекты HTML будут преобразованы в их символьное представление, когда сообщение будет показано.

Ответ 4

Это проблема, потому что не все объекты HTML являются объектами XML. Вы можете импортировать DTD HTML в свой документ в качестве предложения Pat или выполнить одно из следующих действий:

Заменить все события специального символа на числовой код объекта:

&raquo; becomes &#187;

Оберните все вхождения специальных символов в теге CDATA

<![CDATA[&raquo;]]>

Определить сущности в верхней части документа

<!DOCTYPE ROOT_XML_ELEMENT [ <!ENTITY raquo "&#187;"> ]>

Ответ 5

Используете ли вы символ "или", или определяете его как & raquo;? Если вы используете экранированный символ, вы забыли точку с запятой?

Ответ 6

Джо

Когда я использую версию unicode, вы видите квадрат.

Внесение сущности decalration в документ xml создает "Не может иметь DTD-объявление вне DTD". ошибка. Я предполагаю, что это ожидается.

Когда я использую '', чтобы включить dtd извне, это не имеет никакого эффекта.

Мне интересно, может быть, это проблема сервера. Я разрабатываю это локально и использую Baby Web Server.

Ответ 7

просто замените свой HTML-объект &raquo; на числовую ссылку &#187;, которая хороша в любых XML и HTML.

Ответ 8

Я много раз искал такую ​​информацию, поэтому решил опубликовать матрицу на моем собственном сайте для простой цели быстрого поиска:

http://martinkool.com/characters

Используйте & #...; форма действительно.

Ответ 9

Если вы хотите, чтобы выходной документ содержал именованный объект HTML &raquo;, а не числовую ссылку, добавьте следующие элементы в таблицу стилей (только XSLT2.0):

<xsl:output use-character-maps="raquo.ent"/>
<xsl:character-map name="raquo.ent">
    <xsl:output-character character="&#187;" string="&amp;raquo;"/>
</xsl:character-map>