2009-06-16 6 views
6

Ich möchte eine Funktion schreiben, die eine (theoretisch) unbekannte XML-Datenstruktur in ein äquivalentes PHP-Array parst.Iterieren über unbekannte XML-Struktur mit PHP (DOM)

Hier ist mein Beispiel XML:

$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/>"; 
    } 

Nun, wegen der Art, wie ich die Elemente in das Array vorbei bin ich:

<?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> 

ich dieses DOM Iterieren Funktion von devarticles geändert m alle Elemente überschreiben, die einen Knotennamen teilen (da ich den Schlüsseln im Idealfall die gleichen Namen geben möchte wie ihre Ausgangsknoten). Meine Rekursion ist nicht großartig ... Aber selbst wenn ich die Klammern lease - die zweite Schicht der Knoten kommen immer noch als Werte auf der ersten Stufe (siehe den Text der Beschreibung Knoten).

Wer hat irgendwelche Ideen, wie ich das besser konstruieren kann?

Antwort

2

könnten Sie besser dran, nur einen Code aus dem Netz

snagging

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

Sie könnten in SimpleXML oder xml_parse_into_struct interessiert.

$ arraydata wird weder an nachfolgende Anrufe weitergeleitet xml2array() noch ist der Rückgabewert verwendet, also ja „Meine Rekursion ist nicht so toll ...“ wahr ;-)
Um ein neues Element ein anhängen bestehendes Array können Sie leere eckige Klammern verwenden, $ arr [] = 123; $ arr [$ x] [] = 123;

+0

Ich habe eine Methode machen, die das Array zurück in geht, aber ich möchte, um herauszufinden, warum es nicht, diese zweite Stufe Knoten zu sehen. Wie fügt man diesen letzten Satz leerer Klammern in ein Array unbekannter Tiefe ein? – sunwukung

+0

Ich meine, hast du das Skript in dem Beitrag über deinem gesehen ... es ist ein Biest! – sunwukung