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

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

11 голосов
/ 16 октября 2008

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

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

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

Ответы [ 9 ]

21 голосов
/ 16 октября 2008

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

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

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

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

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

»
6 голосов
/ 16 октября 2008

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

<!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 голосов
/ 16 октября 2008

Вам не нужно объявлять сущность в вашем 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, это было бы сделано для вас автоматически.

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

1 голос
/ 16 октября 2008

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

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

&raquo; becomes &#187;

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

<![CDATA[&raquo;]]>

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

<!DOCTYPE ROOT_XML_ELEMENT [ <!ENTITY raquo "&#187;"> ]>
0 голосов
/ 05 октября 2010

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

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

http://martinkool.com/characters

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

0 голосов
/ 17 октября 2008

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

0 голосов
/ 16 октября 2008

Джо

При использовании Unicode-версии отображается квадрат.

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

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

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

0 голосов
/ 16 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...