2009-06-16 19 views
6

Quiero escribir una función que analiza una estructura de datos XML desconocida (teóricamente) en una matriz PHP equivalente.iterando sobre una estructura XML desconocida con PHP (DOM)

Aquí es mi XML de ejemplo:

<?xml version="1.0" encoding="UTF-8"?> 
<content> 

<title>Sample Text</title> 

<introduction> 
    <paragraph>This is some rudimentary text</paragraph> 
</introduction> 
<description> 
    <paragraph>Here is some more text</paragraph> 
    <paragraph>Even MORE text</paragraph> 
    <sub_section> 
     <sub_para>This is a smaller, sub paragraph</sub_para> 
     <sub_para>This is another smaller, sub paragraph</sub_para> 
    </sub_section> 
</description> 
</content> 

he modificado esta función la iteración de DOM devarticles:

$data = 'path/to/xmldoc.xml'; 
$xmlDoc = new DOMDocument(); #create a DOM element 
$xmlDoc->load($data); #load data into the element 
$xmlRoot = $xmlDoc->firstChild; #establish root 

function xml2array($node) 
    { 
    if ($node->hasChildNodes()) 
    { 
$subNodes = $node->childNodes; 
    foreach ($subNodes as $subNode) 
     { 
     #filter node types 
     if (($subNode->nodeType != 3) || (($subNode->nodeType == 3))) 
      { 
      $arraydata[$subNode->nodeName]=$subNode->nodeValue; 
      } 
     xml2array($subNode); 
     } 
     } 
     return $arraydata; 
    } 
//The getNodesInfo function call 

$xmlarray = xml2array($xmlRoot); 


// print the output - with a little bit of formatting for ease of use... 
foreach($xmlarray as $xkey) 
    { 
    echo"$xkey<br/><br/>"; 
    } 

Ahora, debido a la forma en que estoy pasando los elementos de la matriz I' Sobreescribir cualquier elemento que comparta un nombre de nodo (ya que idealmente quiero darles a las claves los mismos nombres que sus nodos de origen). Mi recursión no es buena ... Sin embargo, incluso si vacío los corchetes, el segundo nivel de nodos sigue apareciendo como con los valores en el primer nivel (consulte el texto del nodo de descripción).

¿Alguien tiene alguna idea de cómo puedo construir mejor esto?

Respuesta

2

Quizás se enganchen mejor simplemente algo de código fuera de la red

http://www.bin-co.com/php/scripts/xml2array/

/** 
    * xml2array() will convert the given XML text to an array in the XML structure. 
    * Link: http://www.bin-co.com/php/scripts/xml2array/ 
    * Arguments : $contents - The XML text 
    *    $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value. 
    *    $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance. 
    * Return: The parsed XML in an array form. Use print_r() to see the resulting array structure. 
    * Examples: $array = xml2array(file_get_contents('feed.xml')); 
    *    $array = xml2array(file_get_contents('feed.xml', 1, 'attribute')); 
    */ 
    function xml2array($contents, $get_attributes=1, $priority = 'tag') { 
1

Usted puede estar interesado en SimpleXML o xml_parse_into_struct.

$ arraydata ni se pasa a las llamadas posteriores a xml2array() ni el valor de retorno utilizado, así que sí "Mi recursividad no es muy grande ..." Es cierto ;-)
para añadir un nuevo elemento a una matriz existente puede usar corchetes vacíos, $ arr [] = 123; $ arr [$ x] [] = 123;

+0

Hice un método que pasa la matriz de nuevo, pero quiero averiguar por qué no está viendo a esos nodos 2º nivel. Además, ¿cómo se puede seguir añadiendo el último conjunto de paréntesis vacíos en una matriz de profundidad desconocida? – sunwukung

+0

Quiero decir, ¿has visto el guión en la publicación de arriba de los tuyos ... es una bestia! – sunwukung

Cuestiones relacionadas