2008-10-16 51 views
10

Estoy creando un sistema de navegación a la izquierda que utiliza xml y xsl. Todo fue genial hasta que intenté usar un carácter especial en mi documento xml. Estoy usando » y obtengo un error.Caracteres especiales en XML

reason: Referencia a undefined entity 'raquo'. código
de error: -1072898046

¿Cómo puedo hacer este trabajo?

Respuesta

0

¿Está utilizando el símbolo »directamente o lo está definiendo como & raquo; ? Si está utilizando el símbolo de escape, ¿se olvidó del punto y coma?

+0

estoy definiendo como ». Comprobado dos veces y no, no olvide el punto y coma que se perdió cuando pegué aquí. – BillZ

5

¿ha especificado un tipo de documento para su archivo?

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

Creo que es posible que obtenga tales errores si olvida especificarlo.

También a veces las entidades funcionan si las especifica por número en lugar de nombre.

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

que es un DOCTYPE HTML. –

+0

No, es un Doctype XHTML. XHTML es una aplicación XML y define '»'. – Quentin

20

Usted está tratando de utilizar un HTML entity en un no-documento HTML o XHTML no. Estas entidades se declaran en el documento Document Type Definition (DTD).

Debe usar la versión numérica Unicode del entity reference. Por ejemplo, en el caso de &raquo; se debe utilizar &#187;

Alternativamente, puede define them in your XML document's DTD:

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

De lo contrario, si el documento es UTF-8, creo que sólo puede utilizar el carácter real directamente en su documento XML

» 
+2

Definitivamente utilice caracteres Unicode o referencias de entidad Unicode si puede.Las referencias de caracteres con nombre deberían evitarse en XML. –

+1

Es muy posible que el OP no tenga una DTD para su XML. Incluso entonces, su respuesta podría usarse dentro de un subconjunto interno si el usuario lo deseara. Sin embargo, tienes razón en que la respuesta simple es UTF-8 y simplemente usa el personaje. –

1

Esto es un problema porque no todas las entidades HTML son entidad XML. Puede importar el DTD de HTML en el documento como sugirió la patente, o lleve a cabo una de las siguientes:

sustituir todas las ocurrencias del carácter especial con el código de entidad numérica:

&raquo; becomes &#187; 

abrigo de todas las ocurrencias de los caracteres especiales en una etiqueta CDATA

<![CDATA[&raquo;]]> 

Definir entitys en la parte superior de su documento

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

Joe

Cuando uso la versión Unicode muestra un cuadrado.

Al poner la descalificación de entidad en el documento xml se produce una "No se puede tener una declaración de DTD fuera de una DTD". error. Supongo que esto es esperado.

Cuando uso '' para incluir el dtd externamente no parece tener ningún efecto.

Me pregunto si esto es tal vez un problema del servidor. Estoy desarrollando esto localmente y usando Baby Web Server.

+1

si obtiene el cuadrado, entonces no declara la codificación correctamente o tiene una codificación incorrecta del archivo. Asegúrese de utilizar siempre UTF-8 y, si es posible, envíe Content-Type: application/xml; charset = UTF-8 encabezado HTTP. Si eso no es posible, agregue Al documento. – Kornel

3

No necesita declarar una entidad en su DTD, o incluso usar una DTD. Probablemente no necesites usar la representación Unicode del personaje. Usted ciertamente no necesita usar una sección CDATA.

Lo que debe hacer es usar un DOM para compilar su XML en lugar de tratar de compilarlo con la manipulación de cadenas. El DOM solucionará este problema por ti.

En C#, este código:

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

produce esta salida:

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

Como se puede ver en el primer ejemplo, el carácter » es perfectamente legal en texto XML. Pero no creo que estés tratando de representar a ese personaje.

Creo que estás tratando de hacer lo que está en el segundo ejemplo, basado en el mensaje de error que informaste. Está intentando representar la cadena de caracteres &raquo;. La forma correcta de representar esa cadena de caracteres en texto XML es escapando del signo y; por lo tanto: &amp;raquo;.

Así que si debe utilizar la manipulación de cadenas para compilar su XML, simplemente asegúrese de escapar de cualquier símbolo en sus datos de origen. No para aclarar el punto, pero si estuvieras usando un DOM, esto se habría hecho automáticamente.

Una cosa más. Es bastante probable que en su pregunta original, que ahora dice "Estoy usando», lo que en realidad mecanografió es "Estoy usando & raquo;". La publicación actual no se ve así, sin embargo. Si necesita representar texto literalmente en el marcado, enciérrelo en los puntos atrás; de lo contrario, las entidades HTML se convertirán a su representación de caracteres cuando se represente la publicación.

+0

Me pregunto por qué ha sido downvoted. Es una respuesta perfectamente correcta. – bortzmeyer

0

simplemente reemplace su entidad HTML &raquo; con la referencia numérica &#187; que es buena en cualquier XML y HTML.

0

me encontré buscando en Google para tal información mucho, así que decidió publicar una matriz en mi propio sitio con el simple propósito de ser rápidamente capaz de hacer una búsqueda:

http://martinkool.com/characters

Uso del & # ...; forma de hecho

0

Si desea que el documento de salida para contener la entidad HTML denominado &raquo; en lugar de la referencia numérica, añadir los siguientes elementos a la hoja de estilos (XSLT2.0 única):

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