/ / Iterieren über unbekannte XML-Struktur mit PHP (DOM) - PHP, XML, Arrays, Parsing, Schleifen

Iterieren über unbekannte XML-Struktur mit PHP (DOM) - PHP, XML, Arrays, Parsing, Schleifen

Ich möchte eine Funktion schreiben, die eine (theoretisch) unbekannte XML-Datenstruktur in ein äquivalentes PHP-Array zerlegt.

Hier ist mein Beispiel XML:

<?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 habe diese DOM-Iterationsfunktion von devparticles modifiziert:

$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 und Weise, wie ich die Elemente passierezu dem Array Ich überschreibe alle Elemente, die einen Knotennamen teilen (da ich idealerweise den Schlüsseln die gleichen Namen geben möchte wie ihre Ausgangsknoten). Meine Rekursion ist nicht großartig ... Aber selbst wenn ich die Klammern leere - die zweite Knotenebene kommt immer noch als Werte auf der ersten Ebene (siehe den Text des Beschreibungsknotens).

Hat jemand Ideen, wie ich das besser konstruieren kann?

Antworten:

0 für die Antwort № 1

Vielleicht möchten Sie auch XML Unserializer auschecken

http://pear.php.net/package/XML_Serializer/redirected


2 für die Antwort № 2

Sie könnten besser dran sein, wenn Sie einfach einen Code aus dem Netz schnappen

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 für die Antwort № 3

Das könnte Sie interessieren EinfachesXML oder xml_parse_into_struct.

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