Специальные символы в XML
Я создаю левую навигационную систему, используя xml и xsl. Все шло отлично, пока я не попытался использовать специальный символ в своем XML-документе. я использую »
и я получаю ошибку.
причина: ссылка на неопределенную сущность 'raquo'.
код ошибки: -1072898046
Как мне сделать эту работу?
9 ответов
Вы пытаетесь использовать сущность HTML в документе, отличном от HTML или не XHTML. Эти объекты объявлены в определении типа документа (DTD).
Вы должны использовать числовую версию ссылки на сущность в Юникоде. Например, в случае »
ты должен использовать »
Кроме того, вы можете определить их в DTD вашего XML-документа:
<!ENTITY entity-name "entity-value">
<!ENTITY raquo "»">
В противном случае, если ваш документ имеет формат UTF-8, я считаю, что вы можете просто использовать фактический символ непосредственно в своем XML-документе.
»
Вы указали тип документа для своего файла?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Я думаю, что вы можете получить такие ошибки, если вы забудете указать это.
Также иногда сущности работают, если вы указываете их по номеру, а не по имени.
» « instead of » and «
Вам не нужно объявлять сущность в вашем 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: »";
Debug.WriteLine(d.OuterXml);
производит этот вывод:
<foo>Here's that character: »</foo>
<foo>Here it is as an HTML entity: &raquo;</foo>
Как видно из первого примера, символ "совершенно допустим в тексте XML. Но я не думаю, что вы пытаетесь представить этого персонажа.
Я думаю, что вы пытаетесь сделать то, что во втором примере, основываясь на сообщении об ошибке, о котором вы сообщили. Вы пытаетесь представить строку символов »
, Правильный способ представления этой строки символов в тексте XML - экранирование; таким образом: &raquo;
,
Поэтому, если вы должны использовать манипуляции со строками для создания своего XML, просто убедитесь, что вы избегаете любых амперсандов в ваших исходных данных. Не для того, чтобы понять смысл, но если бы вы использовали DOM, это было бы сделано для вас автоматически.
Еще одна вещь. Вполне вероятно, что в исходном вопросе, который теперь гласит "Я использую", вы фактически ввели "Я использую & raquo;". Тем не менее, фактическое сообщение не выглядит так. Если вам нужно представить текст буквально в уценке, заключите его в кавычки; в противном случае сущности HTML будут преобразованы в их символьное представление при отображении поста.
Это проблема, потому что не все сущности HTML являются сущностями XML. Вы можете импортировать DTD HTML в ваш документ, как предложил Пат, или выполнить одно из следующих действий:
Замените все вхождения специального символа числовым кодом объекта:
» becomes »
Оберните все вхождения специальных символов в тег CDATA
<![CDATA[»]]>
Определите объекты в верхней части вашего документа
<!DOCTYPE ROOT_XML_ELEMENT [ <!ENTITY raquo "»"> ]>
Используете ли вы непосредственно символ "или определяете его как & r aquo;? Если вы используете экранированный символ, вы забыли точку с запятой?
Просто замените свой HTML-объект »
с числовой ссылкой »
что хорошо в любом XML и HTML.
Джо
Когда я использую версию Unicode показывает квадрат.
Помещение декалирования сущности в документ XML приводит к "Невозможно иметь объявление DTD вне DTD". ошибка. Я полагаю, это ожидается.
Когда я использую '', чтобы включить dtd извне, это не оказывает никакого влияния.
Мне интересно, если это может быть проблема с сервером. Я разрабатываю это локально и использую Baby Web Server.
Я нашел себя в поисках такой информации, поэтому решил разместить на своем сайте матрицу с простой целью быстрого поиска:
http://martinkool.com/characters
Использовать ...; форма действительно.
Если вы хотите, чтобы выходной документ содержал именованную сущность HTML »
вместо числовой ссылки добавьте следующие элементы в таблицу стилей (только XSLT2.0):
<xsl:output use-character-maps="raquo.ent"/>
<xsl:character-map name="raquo.ent">
<xsl:output-character character="»" string="&raquo;"/>
</xsl:character-map>