Portal > Foren > Ausschreibungssprachen und clientseitige Programmierung > HTML, XML und CSS > [PHP | XML] Probleme bei Konvertierung eines XML-Dokuments in ein Array
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 15.06.2006, 17:35 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard [PHP | XML] Probleme bei Konvertierung eines XML-Dokuments in ein Array

Hallo,
ich bin ein Laie, was die Verwendung von XML mit PHP angeht. Das mal im Voraus.

Ich wollte gerne ein XML-Dokument auslesen und die Daten danach in Form eines Arrays vorliegen haben.
Über Google bin ich dann auf diese Funktion hier gestoßen.

Mein Quelltext sieht nun folgendermaßen aus:
PHP-Code:
<?php

function xml_array($node
{
    
$xml_arr = array();
    
    while (
$node
    {
        if (
$node->has_child_nodes())
        {
            
$first_child $node->first_child();
            if (
$first_child->node_type() == XML_ELEMENT_NODE
            {
                
$xml_arr[$node->node_name()][] = xml_array($first_child);
            }
            else
            {
                if (isset(
$xml_arr[$node->node_name()]))
                {
                    if (!
is_array($xml_arr[$node->node_name()]))
                    {
                        
$xml_arr[$node->node_name()] = array($xml_arr[$node->node_name()]);
                    }
                        
                    
$xml_arr[$node->node_name()][] = stripslashes(utf8_decode($first_child->node_value()));
                }
                else
                {
                    
$xml_arr[$node->node_name()] = stripslashes(utf8_decode($first_child->node_value()));
                }
            }
        }
        
$node $node->next_sibling();
    }
        
    return 
$xml_arr;
}

$document DomDocument::load('test.xml');
$data xml_array($document);

echo 
'<pre>'var_dump($data); echo '</pre>';

?>
Wenn ich die Seite nun aufrufe erhalte ich folgende Meldung:
Zitat:
Fatal error: Call to undefined method DOMDocument::has_child_nodes() in C:\apachefriends\xampp\htdocs\dev\dummy.php on line 10
Binsch was verwirrt, weil doch DomNode eine Oberklasse von DomDocument ist, oder nicht?

Wäre super, wenn mir da jemand weiterhelfen könnte.

Grüße, Ben.


[EDIT]
Okido.
Hab das jetzt mal so gemacht
PHP-Code:
$document DomDocument::load('test.xml');
$node =  $document->getElementsByTagName('config'); 

$data xml_array($node); 
Dann erhalte ich
Zitat:
Fatal error: Call to undefined method DOMNodeList::has_child_nodes() in C:\apachefriends\xampp\htdocs\dev\dummy.php on line 9
Ich steh doch hier irgendwie auf dem Schlauch oder wie? *kopfkratz*

Geändert von Ben (15.06.2006 um 17:44 Uhr)
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 18:31 Nach oben    #2
Jay
Gast
 
Beiträge: n/a
Standard

DomDocument::getElementsByTagName liefert ein DomNodeList Objekt und ein DomNodeList Objekt hat keine Methode has_child_nodes. DomNode dagegen hat eine hasChildNodes() Methode.

Für dich ist vielleicht die DomNodeList::items (index) Methode interessant, weil die ein DomNode Objekt zurückliefet

Aber poste doch mal deine XML Datei, damit wir dir besser helfen können.

Btw.: SimpleXML ist in für deine Aufgabe anscheinend besser geeignet. DomDocument läd nämlich das gesamte Dokument und weil du nur die 'config' Elemente haben willst brauchst du nicht das gesamte Dokument.

Außerdem solltest du nicht die statische Methode DOMDocument::load verwenden, sondern ein Objekt von DomDocument instanzieren weil erstere bei E_STRICT einen WARNING ausgibt.

Jay

Geändert von Jay (15.06.2006 um 18:33 Uhr)
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 18:45 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Da in dem Dokument nur die "config"-Sachen drin sind sollte sich der Unterschied zu SimpleXML in Grenzen halten, oder?

Die XML-Datei sieht so aus
Code:
<?xml version='1.0' standalone='yes'?>
<config>
 <database>
  <host>localhost</host>
  <user>root</user>
  <password></password>
  <name>shop</name>
  <prefix>shop__</prefix>
 </database>

 <general>
  <mod_rewrite>true</mod_rewrite>
  <controller>Controller</controller>
 </general>
</config>
Ehrlich gesagt habe ich nicht so ganz verstanden, was du mir jetzt sagen wolltest. Ist mir schon bewusst, dass "getElementsByTagName" ein Objekt vom Typ DomNodeList zurückgibt.
Ich wollte nur zeigen, was ich derzeit habe. Ich weiß, dass es falsch ist.

Die Verwendung der Methode items() habe ich nicht so ganz verstanden ..

Danke für jede weitere Hilfe.

Grüße, Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 19:00 Nach oben    #4
Jay
Gast
 
Beiträge: n/a
Standard

Beispiel zu items:
PHP-Code:

foreach ($domNodeList as $domNode)
   echo 
$domNode->$nodeValue // database und general 
DOMNode hat nun die hasChildNodes () Methode
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 19:46 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Ja, aber ich verstehe nicht, wozu ich eine Schleife brauche.
Also, um die Funktion aufrufen zu können brauche ich ja ein "node" ... aber auch nur das oberste oder nicht?
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 19:55 Nach oben    #6
Jay
Gast
 
Beiträge: n/a
Standard

Jeder Knoten ist ein DomNode und DomNodeList fast alle Unterknoten in einem Objekt zusammen, wobei ein Unterknoten eben ein DomNode ist. Um jetzt da durch zu iterieren braucht man logischerweise eine foreach Schleife oder wenn man es mit einer for Schleife macht die Methode items, die Praktisch eine getter Methode ist.

Die PHP Dokumentation zum Thema DOM ist nicht wirklich perferkt, deshalb solltest du dir die W3C Spezifikation durchlesen, weil PHP ja auch nix anderes macht als diese zu implementieren.

EDIT:
Die Funktion ist IMHO ein Blödsinn (zumindest für PHP5), weil es die Methoden überhaupt net gibt.


Jay

Geändert von Jay (15.06.2006 um 19:58 Uhr)
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 19:58 Nach oben    #7
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Ja, das habe ich schon verstanden .. also was rauskommen sollte.

Aber wenn ich jetzt das hier mache
PHP-Code:
$document = new DOMDocument();
$document->load('test.xml');
$nodelist =  $document->getElementsByTagName('config'); 

$data = array();

foreach(
$nodelist as $domnode
{
    
$data xml_array($domnode);
    break;
}

echo 
'<pre>'var_dump($data); echo '</pre>'
dann erhalte ich
Zitat:
Fatal error: Call to undefined method DOMElement::has_child_nodes() in C:\apachefriends\xampp\htdocs\dev\dummy.php on line 9
Hä? Hab ich doch nicht alles verstanden? Oder schau ich in die falsche Richtung?
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 20:02 Nach oben    #8
Jay
Gast
 
Beiträge: n/a
Standard

Du übergibts einen DomNode allerdings hat die DomNode Klasse keine has_child_nodes () Methode. Deshalb musst du eine DomNodeList übergeben und die Methoden in PHP 5 konforme Methoden/Eigenschaften umwandeln oder du setzt dich mit dem DOM auseinander und schreibst dir selbst was. Wenn du willst kann ich dir auch schnell was zusammen basteln.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 20:06 Nach oben    #9
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Jetzt mal Tacheles:
Ist die obige Methode gar nicht PHP 5 tauglich oder wie?
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 20:08 Nach oben    #10
Jay
Gast
 
Beiträge: n/a
Standard

Ich hab keine Ahnung wie das in PHP 4 war, allerdings sieh dir doch mal die Dokumentation an und die verwendeten Funktionen in der xml_array Funktion.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 20:11 Nach oben    #11
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Jou, habe ich gerade parallel gemacht. Jupp.
Hm.
Okay .. dann werd ich mich da wohl mal reinarbeiten müssen.
Wills ja auch lernen..

Bei Tipps .. hör ich natürlich gerne zu.

Grüße, Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 20:26 Nach oben    #12
Jay
Gast
 
Beiträge: n/a
Standard

So da ich schon so lange nix mehr in PHP programmiert habe (nur mehr VB.NET ahhh ich hasse diese Syntax), hab ich die Funktion nun doch geschrieben.

PHP-Code:
<?php

class FileNotFoundException extends Exception {}

function 
loadConfig () {
    
    
$dom = new DomDocument ();

    
$array = array ();
    
    if (!@
$dom->load ("test.xml")) {
    
        throw new 
FileNotFoundException ("Unable to load the Document");
    }

    
$firstLevelNodes $dom->getElementsByTagName ("config")->item (0)->childNodes;
    
    foreach (
$firstLevelNodes as $categories) {

        if (
$categories->nodeType !== 1) continue;
        
        
$array [$categories->nodeName] = array ();
        
        
$settings $categories->childNodes;
        
        foreach (
$settings as $setting) {
            
            if (
$setting->nodeType !== 1) continue;
            
            
$array[$categories->nodeName][$setting->nodeName] = $setting->nodeValue;
        }
    }
    
    return 
$array;
}
try {
$configArray loadConfig ();
} catch (
Exception $ex) {
    echo 
$ex->getMessage ();
}

?>
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 20:28 Nach oben    #13
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Jou, so wie ich das sehe ist die Verschachtelungstiefe hier aber beschränkt, weil keine Rekursion genutzt wird, gell?

Nun. Egal.
Danke dafür .. werd ich mir mal anschauen und durcharbeiten. Die rekursive Sache werd ich mir dann selbst zusammenbauen.

Nochmals danke.
Bei Fragen melde ich mich nochmals.

Grüße, Ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.06.2006, 20:32 Nach oben    #14
Jay
Gast
 
Beiträge: n/a
Standard

Naja Rekursion ist ja bei deiner Sache auch nicht zu empfehlen, weil der DOM schon langsam ist und dann auch noch Rekursion ... .

Aber das kannst du eh ganz einfach machen indem du die letzte Schleife mit einem Funktionsaufruf ersetzt und das array modifizierst.

Jay
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45