Pregunta

Estoy tratando de analizar el archivo XML siguiente:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE content PUBLIC "-//BLACKWELL PUBLISHING GROUP//DTD 4.0//EN" "http://www.blackwellpublishing.com/xml/dtds/4-0/bpg4-0.dtd">
<content dtdver="4.0" docfmt="xml">
....
<forenames>NIELS B&Oslash;IE</forenames><x> </x>

Al principio no carga, pero ahora tengo el código de lo que parece en el uso de la DTD de la figura fuera de la entidad como &Oslash; (Ø), pero el siguiente problema es que no muestra el carácter en la salida.

Este es mi código de análisis:

$options = LIBXML_DTDLOAD | LIBXML_NOENT | LIBXML_DTDVALID | LIBXML_NOCDATA;
$doc = simplexml_load_string ( $xml,null,$options );
echo $doc->document->header->namegroup->name->forenames."\n";

Este es el resultado:

NIELS BIE

He probado con DOM análisis de XML y, a continuación, la salida fue NIELS B IE (y por tanto con un espacio..)

alguna idea?

¿Fue útil?

Solución

Buscando en la DTD, dice esto (pero sin saltos de línea):

<!ENTITY Oslash 
    "<symbol name='Oslash' unicode='00D8'
     type='html' glyph='@Oslash;' description='capital O, slash' 
     ascii='O' > </symbol>"
>

Para cualquier lector de XML usando esta DTD, esto significa que "cada vez que vea esta combinación exacta de letras de la fuente: &Oslash;, reemplazarlo con este texto: <symbol name='Oslash' unicode... > </symbol>

Esto significa que los datos XML en realidad se lee como este:

<forenames>NIELS B<symbol name='Oslash' unicode='00D8'
     type='html' glyph='@Oslash;' description='capital O, slash' 
     ascii='O' > </symbol>IE</forenames>

...lo que explica por qué no aparece en su navegador.La manera de evitarlo sería la búsqueda de su documento XML para todos <symbol> elementos, leer el unicode parámetro y reemplazarlos con eso.


Mirando más en ella, los comentarios en la parte superior de la DTD demostrar han considerado a las personas en su situación!El glyph atributo en el <symbol> la etiqueta es el estándar HTML entidad para el uso de ese símbolo, pero con el signo reemplazado con un @.

10 read xml document
20 search for any <symbol> element
30 read the "glyph" attribute
40 remove the <symbol> element
50 replace the @ with an & in glyph
60 write that in the place of <symbol>
70 goto 20

Otros consejos

El DTD que está utilizando con su archivo XML allí no contiene la entidad Oslash. Como tal, el analizador XML simplemente no sabe qué hacer con & # 216; y se produce confusión y / o hilaridad.

Es importante separar la noción HTML de entidades nombradas (de las cuales Oslash es parte) de la noción XML de entidades nombradas (apos, lt, gt, quot, amp). Básicamente, si no es HTML, no hay Oslash (al menos en el caso general, algunos DTD pueden tenerlo, pero puede que no sea el carácter que desea en absoluto.

En otras palabras; siempre use UTF-8. Siempre.

EDITAR: & # 216; también está en latin-1.

Si tiene la codificación correcta, no necesita escapar &Oslash; (& # 216;). Intente usar unicode para asegurarse.

Si no hay forma de cambiar el comportamiento, intente eliminar las entidades HTML, consulte el manual de PHP.

ok, tengo un poco más lejos, si utilizo var_dump en lugar de echo obtengo esto:

object(SimpleXMLElement)[22]
  public 'symbol' => 
  object(SimpleXMLElement)[21]
  public '@attributes' => 
    array
      'name' => string 'Oslash' (length=6)
      'unicode' => string '00D8' (length=4)
      'type' => string 'html' (length=4)
      'glyph' => string '@Oslash;' (length=8)
      'description' => string 'capital O, slash' (length=16)
      'ascii' => string 'O' (length=1)
  string ' ' (length=1)

Me pregunto cómo puedo usar eso para hacer una cadena completa junto con el contenido de los nombres

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top