2011-07-13 71 views
19

¿Cómo puedo obtener valores dentro de <! [CDATA [valores]] > usando php DOM. Esto es un código de mi xml.Cómo obtener valores dentro de <! [CDATA [valores]]> usando php DOM?

 <Destinations> 

     <Destination> 
      <![CDATA[Aghia Paraskevi, Skiatos, Greece]]]]>><![CDATA[ 
      <CountryCode>GR</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Amettla, Spain]]]]>><![CDATA[ 
      <CountryCode>ES</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Amoliani, Greece]]]]>><![CDATA[ 
      <CountryCode>GR</CountryCode> 
     </Destination> 

     <Destination> 
      <![CDATA[Boblingen, Germany]]]]>><![CDATA[ 
      <CountryCode>DE</CountryCode> 
     </Destination> 

    </Destinations> 
+0

¿Estás tratando de leer o escribir en este XML? De cualquier manera, ¿realmente quieres esas secciones duplicadas de CDATA a medida que se publican? –

+0

Quiero leer los valores dentro de CDATA. – Hearaman

Respuesta

31

Trabajar con PHP DOM es bastante sencillo, y es muy similar a DOM de Javascript.

Estas son las clases importantes: la clase

  • DOMNode — La base para cualquier cosa que se puede recorrer el interior de un documento XML/HTML, incluyendo los nodos de texto, nodos de comentarios y nodos CDATA
  • DOMElement — La clase base para etiquetas.
  • DOMDocument — La clase base para documentos. Contiene los métodos para cargar/guardar XML, así como los métodos de documento DOM normales (ver a continuación).

Hay algunos métodos básicos y propiedades:

  • DOMDocument->load() — Después de crear un nuevo DOMDocument, utilizar este método en ese objeto para cargar desde un archivo.
  • DOMDocument->getElementsByTagName() — este método devuelve una lista de nodos de todos los elementos en el documento con el nombre de etiqueta dado. Luego puede iterar (foreach) en esta lista.
  • DOMNode->childNodes — Una lista de nodos de todos los elementos secundarios de un nodo. (Recuerde, una sección deCDATA es un nodo!)
  • DOMNode->nodeType — Consigue el type de un nodo. Los nodos CDATA tienen el tipo XML_CDATA_SECTION_NODE, que es una constante con el valor .
  • DOMNode->textContent — obtener el contenido de texto de cualquier nodo.

Nota: Las secciones de CDATA están mal formadas.No sé por qué hay un extra ]] en la primera, o una sección CDATA no cerrada al final de la línea, pero creo que debe ser simplemente:

<![CDATA[Aghia Paraskevi, Skiatos, Greece]]> 

Poniendo todo esto junto nos:

  1. crear un objeto nuevo documento y cargar el código XML
  2. Obtener todos los elementos por Destination nombre de la etiqueta y iterar sobre la lista
  3. iterar sobre todos los nodos hijos de cada Destination elemento
  4. Comprobar si el tipo de nodo es XML_CDATA_SECTION_NODE
  5. Si es así, el echotextContent de ese nodo.

Código:

$doc = new DOMDocument(); 
$doc->load('test.xml'); 
$destinations = $doc->getElementsByTagName("Destination"); 
foreach ($destinations as $destination) { 
    foreach($destination->childNodes as $child) { 
     if ($child->nodeType == XML_CDATA_SECTION_NODE) { 
      echo $child->textContent . "<br/>"; 
     } 
    } 
} 

Resultado:

Aghia Paraskevi, Skiatos, Grecia
Amettla, España
Amoliani, Grecia
Boblingen, Alemania

+0

Hearaman quiere leer un nodo que contenga CDATA y no crear un nodo con cdata. – JellyBelly

+0

@JellyBelly Lo malinterpreté originalmente. He arreglado mi respuesta. – Nicole

+0

gracias a arreglar Renesis! – JellyBelly

3

Uso reemplazar CDATA antes de analizar el elemento de PHP DOM después de que se puede obtener el InnerXml o innerHtml:

str_replace(array('<\![CDATA[',']]>'), '', $xml); 
+0

debe completar el ejemplo con código de ejemplo para recuperar innerXml o innerHtml ... –

10

Utilice esta:

$parseFile = simplexml_load_file($myXML,'SimpleXMLElement', LIBXML_NOCDATA) 

y al lado:

foreach ($parseFile->yourNode as $node){ 
etc... 
} 
+0

Aunque a la sombra de la respuesta anterior, este es realmente útil, especialmente para nosotros, que comenzamos a desarrollar el uso de simplexml. ¡Gracias! – bbujisic

1

Utilizo el siguiente código. Su no sólo leer todos los datos XML con

<![CDATA[values]] > 

sino también convertir objetos XML para PHP matriz asociativa. Entonces podemos aplicar loop en los datos.

$xml_file_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA),true), true); 

Espero que esto funcione para usted.

2

forma mejor y más fácil

$xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA); 
$xmlJson = json_encode($xml); 
$xmlArr = json_decode($xmlJson, 1); // Returns associative array 
+0

Perfect Ans. +1 –

Cuestiones relacionadas