2008-10-16 4 views
10

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

Причина: Ссылка на неопределенное лицо «raquo». Код
ошибки: -1072898046

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

ответ

0

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

+0

я определяю его как ». Двойной флажок, и я не забыл, что точка с запятой просто пропустила, когда я вставил сюда. – BillZ 2008-10-16 16:08:12

5

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

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

это HTML DOCTYPE. – 2009-12-13 11:41:11

+0

Нет, это XHTML Doctype. XHTML является XML-приложением и определяет `»`. – Quentin 2010-10-05 13:20:57

20

Вы пытаетесь использовать HTML entity в не-HTML или XHTML без документа. Эти объекты объявлены в документе Document Type Definition (DTD).

Вы должны использовать числовую версию Unicode entity reference. Например, в случае &raquo; вы должны использовать &#187;

В качестве альтернативы, вы можете define them in your XML document's DTD:

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

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

» 
+2

Определенно используйте символы юникода или ссылки на объекты юникода, если сможете.Именованные ссылки на символы следует избегать в XML. – 2008-10-16 20:05:54

+1

Вполне возможно, что OP не имеет DTD для своего XML. Даже тогда ваш ответ может быть использован внутри внутреннего подмножества, если пользователь захочет. Однако вы правы, что простой ответ - UTF-8 и просто используйте символ. – 2010-10-05 20:33:34

1

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

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

&raquo; becomes &#187; 

Wrap все появлений из специальные символы в теге CDATA

<![CDATA[&raquo;]]> 

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

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

Joe

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

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

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

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

3

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

0

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

0

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

http://martinkool.com/characters

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

0

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