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

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

причина: ссылка на неопределенную сущность 'raquo'.
код ошибки: -1072898046

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

9 ответов

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

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

Кроме того, вы можете определить их в DTD вашего XML-документа:

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

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

»

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

<!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;

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

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

В C# этот код:

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

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

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

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

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

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

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

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

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

&raquo; becomes &#187;

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

<![CDATA[&raquo;]]>

Определите объекты в верхней части вашего документа

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

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

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

Джо

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

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

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

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

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

http://martinkool.com/characters

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

Если вы хотите, чтобы выходной документ содержал именованную сущность 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>
Другие вопросы по тегам