PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XML File in array



Goldfinger
18-05-2006, 15:35
Ich sitze den ganzen Tag schon vor dem Problem das ich ein xml file in ein array einlesen muss. Als Anfänger tue ich mir da recht herb.
Habe nur php4 zur Verfügung.

Ich sollte halt später einzelne Werte aus dem Array herrausziehen können.

echo $wert[name][1];

Hat mir jemand einen Codeschnippsel?

Romanday
18-05-2006, 16:22
Hat mir jemand einen Codeschnippsel?

Kleiner geht es nicht.:D



$peng=file('Davinci_Code');

undefined
18-05-2006, 17:01
Siehe PHP Manual xml_parse_into_struct


<?php
$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Index array\n";
print_r($index);
echo "\nVals array\n";
print_r($vals);
?>

nEox
18-05-2006, 21:50
Hallo,

der XML_Unserializer bei PEAR ist für sowas wie geschaffen ;)

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

Doku:
http://pear.php.net/manual/en/package.xml.xml-serializer.xml-unserializer.options.php

Es sind aber auch einige Beispiele in dem Download-Paket enthalten.
Eigentlich musst du nur die XML-Datei angeben und sagen in welchem Format du sie gerne formatiert haben willst (also Array, Objekt oder sogar direkt auf Klassen).

Hier ein Beispiel aus der Doku:

<?php
require_once "XML/Unserializer.php";
$options = array(
'complexType' => 'array'
);

$us = new XML_Unserializer($options);
$result = $us->unserialize('example.xml', true);
?>

Grüße,
nEox

Goldfinger
19-05-2006, 08:33
Danke für die Antworten.
Bei dem Code von undefined ist mir unklar wie
ich an die Arrays dann rann komme.




<?php
$file="test.xml";
$depth=0;

function startElement($parser, $name, $attrs) {
global $depth;
for ($i = 0; $i < $depth; $i++) {
print " ";
}
print "$name";
$depth++;
}

function endElement($parser, $name) {
global $depth;
$depth--;
}

function characterData($parser, $data) {
print " $data";
}
$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, "characterData");
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);

$peng=file('Davinci_Code');


echo $peng;
?>


Bei dem Script wird bei $peng nichts ausgespuckt.
Komisch.

Romanday
19-05-2006, 09:57
$peng=file('Davinci_Code');

echo $peng;



Bei dem Script wird bei $peng nichts ausgespuckt.
Komisch.

Es hat ja auch noch nicht peng gemacht.:D
Schau dir mal die function file() an.

undefined
19-05-2006, 17:50
Danke für die Antworten.
Bei dem Code von undefined ist mir unklar wie
ich an die Arrays dann rann komme.




<?php
$file="test.xml";
$depth=0;

function startElement($parser, $name, $attrs) {
global $depth;
for ($i = 0; $i < $depth; $i++) {
print " ";
}
print "$name";
$depth++;
}

function endElement($parser, $name) {
global $depth;
$depth--;
}

function characterData($parser, $data) {
print " $data";
}
$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, "characterData");
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);

$peng=file('Davinci_Code');


echo $peng;
?>


Bei dem Script wird bei $peng nichts ausgespuckt.
Komisch.

Oh je, einer der sich nicht mit XML auskennt :D

Zuerst mal mit File kannst du hier nicht arbeiten weil file() jede Zeile in ein Array Schreibt und es nicht das ist was du möchstest.

xml_set_element_handler($xml_parser, "startElement", "endElement");
startElement ist der Root oder Eltern Knoten (firstChild) den du Parsen möchtest.
endElement ist der Koten an dem parser aufhören soll (lastChild)
Jedes Element innerhalb dieses Knoten wird ein Mehrdimensionales Array geschrieben. Wobei dir die Zeiger und Inhalte der Elemente jeweils in ein Array geschrieben werden.
Das heist - parse into struct - nehme Array mit Element Zeiger und Spreche Array mit Inhalten an.
Ich weis das ist etwas Kompliziert, aber leider hast ja nur PHP 4 unter PHP 5 ist so etwas ein Kinderspiel ;)

TIP: verwende var_dump( "<pre>", $xml, "</pre>" );

nEox
19-05-2006, 21:03
Halllo Goldfinger,

warum kompliziert wenns auch einfach geht. Schau dir doch XML_Unserializer mal an...

Grüße,

nEox

Romanday
19-05-2006, 23:45
Zuerst mal mit File kannst du hier nicht arbeiten weil file() jede Zeile in ein Array Schreibt und es nicht das ist was du möchstest.


Das war doch seine Frage?
Er kann doch danach mit preg_* auslesen was er möchte.

Bei umfangreicheren Aktionen bieten sich natürlich die XML
Funktionen an.