webmaster resource
+ Webmaster Forum von Webmaster-Resource.de » Webcoding » PHP (Moderatoren: Christian Felken, » тнє $υι¢ι∂є « ™)
|-+ [php][xml] Probleme beim ausgeben von xml mit php.
Username:
Password:

Seiten: [1]
Topic Tools  
Read 11. Juni 2007, 14:48:11 #0
Psychokiller

[php][xml] Probleme beim ausgeben von xml mit php.

Hallo,

vorab ich bin noch ein Kacknoob was das ganze angeht, hab also nicht sehr viel Ahnung von php usw..
Ich habe hier eine xml Datei die ich gerne ausgeben bzw. gewissen Inhalt in eine Datenbank schreiben möchte.

Das Problem ist jetzt das ich nicht genau weis wie das alles so funktioniert.

Hier mal die xml Datei:

Code:
<?xml version="1.0" encoding="utf-8" ?>
<RaidInfo>
<Loot>
<key1>
<ItemName>Schulterstücke des Rechtsuchers</ItemName>
<ItemID>28666:0:0:0:0:0:0:1169346118</ItemID>
<Icon>INV_Shoulder_35</Icon>
<Class>Rüstung</Class>
<SubClass>Platte</SubClass>
<Color>ffa335ee</Color>
<Count>1</Count>
<Player>NAME</Player>
<Time>05/27/07 19:07:59</Time>
<Zone>Karazhan</Zone>
<Boss>Shade of Aran</Boss>
<Note><![CDATA[ - Zone: Karazhan - Boss: Shade of Aran]]></Note>
</key1>
<key2>
<ItemName>Vorherrschaftsstab von Tirisfal</ItemName>
<ItemID>28673:0:0:0:0:0:0:1437781574</ItemID>
<Icon>INV_Wand_21</Icon>
<Class>Waffe</Class>
<SubClass>Zauberstäbe</SubClass>
<Color>ffa335ee</Color>
<Count>1</Count>
<Player>NAME</Player>
<Time>05/27/07 19:08:35</Time>
<Zone>Karazhan</Zone>
<Boss>Shade of Aran</Boss>
<Note><![CDATA[ - Zone: Karazhan - Boss: Shade of Aran]]></Note>
</key2>
<key3>
<ItemName>Stiefel des Scheusaltöters</ItemName>
<ItemID>28746:0:0:0:0:0:0:-2110125448</ItemID>
<Icon>INV_Boots_Chain_05</Icon>
<Class>Rüstung</Class>
<SubClass>Schwere Rüstung</SubClass>
<Color>ffa335ee</Color>
<Count>1</Count>
<Player>NAME</Player>
<Time>05/27/07 19:34:29</Time>
<Zone>Karazhan</Zone>
<Boss>Chess Event</Boss>
<Note><![CDATA[ - Zone: Karazhan - Boss: Chess Event]]></Note>
</key3>
<key4>
<ItemName>Beinplatten des Unschuldigen</ItemName>
<ItemID>28748:0:0:0:0:0:0:-1841689992</ItemID>
<Icon>INV_Pants_Plate_18</Icon>
<Class>Rüstung</Class>
<SubClass>Platte</SubClass>
<Color>ffa335ee</Color>
<Count>1</Count>
<Player>NAME</Player>
<Time>05/27/07 19:35:07</Time>
<Zone>Karazhan</Zone>
<Boss>Chess Event</Boss>
<Note><![CDATA[ - Zone: Karazhan - Boss: Chess Event]]></Note>
</key4>
<key5>
<ItemName>Kristall der Leere</ItemName>
<ItemID>22450:0:0:0:0:0:0:2072690686</ItemID>
<Icon>INV_Enchant_VoidCrystal</Icon>
<Class>Handwerkswaren</Class>
<SubClass>Handwerkswaren</SubClass>
<Color>ffa335ee</Color>
<Count>0</Count>
<Player>NAME</Player>
<Time>05/27/07 19:35:18</Time>
<Zone>Karazhan</Zone>
<Boss>Chess Event</Boss>
<Note><![CDATA[ - Zone: Karazhan - Boss: Chess Event]]></Note>
</key5>
<key6>
<ItemName>Talbalgbrustharnisch des Gorillas</ItemName>
<ItemID>24904:0:0:0:0:0:-10:1704919095</ItemID>
<Icon>INV_Shirt_04</Icon>
<Class>Rüstung</Class>
<SubClass>Schwere Rüstung</SubClass>
<Color>ff1eff00</Color>
<Count>1</Count>
<Player>NAME</Player>
<Time>05/27/07 18:18:14</Time>
<Zone>Karazhan</Zone>
<Boss>Trash mob</Boss>
<Note><![CDATA[ - Zone: Karazhan - Boss: Trash mob]]></Note>
</key6>
<key7>
<ItemName>Knochenfresserschädelkappe der Intelligenz</ItemName>
<ItemID>24777:0:0:0:0:0:-19:1006567476</ItemID>
<Icon>INV_Helmet_15</Icon>
<Class>Rüstung</Class>
<SubClass>Leder</SubClass>
<Color>ff1eff00</Color>
<Count>1</Count>
<Player>NAME</Player>
<Time>05/27/07 17:57:08</Time>
<Zone>Karazhan</Zone>
<Boss>Trash mob</Boss>
<Note><![CDATA[ - Zone: Karazhan - Boss: Trash mob]]></Note>
</key7>
</Loot>
</RaidInfo>

Das eigentliche Problem ist jetzt das <key1>, <key2> usw.

Wenn ich die Zahlen hinter dem <key> wegmache funktioniert es eigentlich so wie ich es haben will aber auch nicht direkt so wie ich es mir vorstelle. ^^

Kann ja mal zeigen wie das Script aussieht wie es im mom funktioniert wenn ich die Zahlen wegmache hinter dem Key (aber bitte nicht lachen XD).

Code:
<?php
include 'config1.php';
$raid simplexml_load_file("raid.xml");
for(
$i 0$i <= 10$i++)
{
$itemname $raid->Loot->key[$i]->ItemName;
$itemid $raid->Loot->key[$i]->ItemID;
$itemid trim($itemid"item:");
$itemid preg_split("/:/"$itemid);
$icon $raid->Loot->key[$i]->Icon;
$class $raid->Loot->key[$i]->Class;
$subclass $raid->Loot->key[$i]->SubClass;
$color $raid->Loot->key[$i]->Color;
if (
$color=='ffa335ee') {$color='epic';}
if (
$color=="ff0070dd") {$color='rare';}
if (
$color=="ff1eff00") {$color='uncommon';}
$player $raid->Loot->key[$i]->Player;
$time $raid->Loot->key[$i]->Time;
$zone $raid->Loot->key[$i]->Zone;
$boss $raid->Loot->key[$i]->Boss;

$sql="SELECT * FROM items WHERE itemid='$itemid[0]'";
$data=mysql_query($sql$db);
while (
$item mysql_fetch_object ($data)) { 
$doppelt $item->itemid;}
if (!empty(
$itemid[0]) AND $doppelt!=$itemid[0] AND $color!='uncommon') {
$SQL "INSERT INTO items (itemname, itemid, icon, class, subclass, color, player, time, zone, boss) VALUES ('$itemname', '$itemid[0]', '$icon', '$class', '$subclass', '$color', '$player', '$time', '$zone', '$boss')";
mysql_query($SQL$db);}
}
?>

Aber eigentlich möchte ich es so (sofern das überhaupt möglich ist), die xml Datei soll ausgelesen werden so das er automatisch weiss wieviele <key1>,<key2> usw. in der xml Datei sind und er mir das ganze dann halt automatisch direkt in die Datenbank schreibt.
Also so wie es das Script oben auch macht, nur eben so das ich nicht vorher noch was in der xml datei umschreiben muss.
Und das ich diese for schleife da evtl. nicht mehr brauche aber habs halt nur damit so hinbekommen wie ich es wollte. ^^

Mit freundlichen Grüßen

Psychokiller
« Letzte Änderung: 11. Juni 2007, 15:16:33 von EpiX »
Offline  
Read 12. Juni 2007, 09:21:14 #1
Christian Felken

Re: [php][xml] Probleme beim ausgeben von xml mit php.

Hallo und willkommen beim Webmaster Resource Forum!

Die Syntax der XML-Quelldatei ist leider nicht korrekt. Key1, Key2 usw. macht tatsächlich keinen Sinn. Ebenso wenig die deutschen Umlaute! Die müssen entsprechend kodiert werden. Ansonsten wird das immer wieder zu Problemen führen und Du bastelst nur an Deinem Script zum Auslesen rum.

Wenn die Quelldatei im korrekten Format ist, kannst Du auch die XML Parser Funktionen von PHP benutzen:

Code:
<?php

$DateinameXML 
"1.xml";

$FilePointer fopen($DateinameXML"r");
$Daten fread($FilePointerfilesize($DateinameXML));
fclose($FilePointer);

$Parser xml_parser_create();
xml_parse_into_struct($Parser$Daten$arrValues$arrIndex);
xml_parser_free($Parser);

echo 
"Index array\n";
print_r($arrIndex);
echo 
"\nVals array\n";
print_r($arrValues);

?>

Den Array musst Du dann selbstverständlich noch in die MySQL-Tabelle einlesen.


Viele Grüße

Christian Felken

Webmaster Resource - Alles für Webmaster!
www.webmaster-resource.de
Offline  
Read 12. Juni 2007, 11:08:53 #2
Psychokiller

Re: [php][xml] Probleme beim ausgeben von xml mit php.

Vielen dank für deine Antwort nur bin ich jetzt leicht überfordert.
Ich habe jetzt zumindest schonmal die möglichkeit die xml Datei auszulesen mit php 4, was sehr gut ist da ich sonst alles immer per php 5 von meinem Rechner in die andere Datenbank übertragen musste da bei uns auf dem server nur php 4 läuft.

Das mit den Umlauten sollte kein Problem sein zumindest was das ausgeben betrifft.
Dafür benutze ich dann:
<meta charset="utf-8">
 
Nur versteh ich jetzt nicht mehr was ich machen muss um auf die einzelnen inhalte zuzugreifen. Unentschlossen

Habe jetzt hier mal dein Script benutzt:

http://www.gilde.cs-united.de/xml/test.php

jetzt bekomme ich eine wilde Ausgabe und versteh davon nur Bahnhof. Unentschlossen
Im seiten Quelltext sieht das ganze noch geordnet aus aber verstehen tu ich trotzdem nichts.

Also die Struktur des auszulesenden abschnitts sieht ja wie folgt aus.
Code:
<key>
  <ItemName>Schulterstücke des Rechtsuchers</ItemName>
  <ItemID>28666:0:0:0:0:0:0:1169346118</ItemID>
  <Icon>INV_Shoulder_35</Icon>
  <Class>Rüstung</Class>
  <SubClass>Platte</SubClass>
  <Color>ffa335ee</Color>
  <Count>1</Count>
  <Player>Crasp</Player>
  <Time>05/27/07 19:07:59</Time>
  <Zone>Karazhan</Zone>
  <Boss>Shade of Aran</Boss>
  <Note><![CDATA[ - Zone: Karazhan - Boss: Shade of Aran]]></Note>
</key>
Davon hab ich ja jetzt nen paar immer unterschiedlich wieviele es sind.
Jetzt möchte ich ja den Inhalt von den einzelnen Sachen in die Datenbank schreiben ausser den Teil in <note></note>.
Nur hab ich wie gesagt jetzt keine Ahnung mehr wie ich das jetzt machen soll bzw. wie das funktioniert.
 (jetzt versteh ich auch wieso das andere Simplexml heist) ^^
« Letzte Änderung: 23. Juni 2007, 14:49:22 von EpiX »
Offline  
Read 13. Juni 2007, 10:03:00 #3
Christian Felken

Re: [php][xml] Probleme beim ausgeben von xml mit php.

Leider kann ich nur Pseudocode liefern, da ich im Moment einfach zu wenig Zeit habe:

Wenn Du Dir den Array mit den Werten anguckst, gibt es folgende Struktur:

    [2] => Array
        (
            [tag] => KEY
            [type] => open
            [level] => 3
            [value] =>

        )

    [3] => Array
        (
            [tag] => ITEMNAME
            [type] => complete
            [level] => 4
            [value] => Schulterstücke des Rechtsuchers
        )

...

    [27] => Array
        (
            [tag] => KEY
            [type] => close
            [level] => 3
        )

Also mit einer/mehreren Schleife und diversen IF-Abfragen durch den Array gehen und dabei die SQL-Befehle zusammenbauen. Beispielsweise fängt immer ein neuer Eintrag (KEY) an, wenn Du auf [tag] == "KEY" und [type] == "open" stößt. Danach folgende dann alle Tags des niedrigsten Levels (4), die jeweils vollständig (complete) sind. Nachdem Du durch alle Einzeltags durch bist, kommt das Ende des Eintrages (wenn [tag] == "KEY" und [type] == "close").


Viele Grüße

Christian Felken

Webmaster Resource - Alles für Webmaster!
www.webmaster-resource.de
Offline  
Read 15. Juni 2007, 00:33:34 #4
Daniel

Re: [php][xml] Probleme beim ausgeben von xml mit php.

Hallo,

Deine XML-Datei lässt sich nicht einlesen / umwandeln weil es dort ungültige Zeichen / Umlaute gibt.
Habe mal schnell eine Funktion zum bereinigen geschrieben um alle Wert in dem Array zu erfassen.
Die XML - Datei habe ich unter xml.xml gespeichert

hier der Code:
Code:
<?php
function uni_code($string){
// Kleine Funktion um in XML unzulässige Zeichen zu ersetzen

$zeichen = array(" ","¡","¢","£","¤","¥","¦","§","¨","©","ª","«","¬","­","®","¯","°","±","²","³","´","µ","¶","·","¸","¹","º","»","¼","½","¾","¿","À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","Ð","Ñ","Ò","Ó","Ô","Õ","Ö","×","Ø","Ù","Ú","Û","Ü","Ý","Þ","ß","à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î","ï","ð","ñ","ò","ó","ô","õ","ö","÷","ø","ù","ú","û","ü","ý","þ","ÿ");
$ersetzung = array("&#38;#160;","&#38;#161;","&#38;#162;","&#38;#163;","&#38;#164;","&#38;#165;","&#38;#166;","&#38;#167;","&#38;#168;","&#38;#169;","&#38;#170;","&#38;#171;","&#38;#172;","&#38;#173;","&#38;#174;","&#38;#175;","&#38;#176;","&#38;#177;","&#38;#178;","&#38;#179;","&#38;#180;","&#38;#181;","&#38;#182;","&#38;#183;","&#38;#184;","&#38;#185;","&#38;#186;","&#38;#187;","&#38;#188;","&#38;#189;","&#38;#190;","&#38;#191;","&#38;#192;","&#38;#193;","&#38;#194;","&#38;#195;","&#38;#196;","&#38;#197;","&#38;#198;","&#38;#199;","&#38;#200;","&#38;#201;","&#38;#202;","&#38;#203;","&#38;#204;","&#38;#205;","&#38;#206;","&#38;#207;","&#38;#208;","&#38;#209;","&#38;#210;","&#38;#211;","&#38;#212;","&#38;#213;","&#38;#214;","&#38;#215;","&#38;#216;","&#38;#217;","&#38;#218;","&#38;#219;","&#38;#220;","&#38;#221;","&#38;#222;","&#38;#223;","&#38;#224;","&#38;#225;","&#38;#226;","&#38;#227;","&#38;#228;","&#38;#229;","&#38;#230;","&#38;#231;","&#38;#232;","&#38;#233;","&#38;#234;","&#38;#235;","&#38;#236;","&#38;#237;","&#38;#238;","&#38;#239;","&#38;#240;","&#38;#241;","&#38;#242;","&#38;#243;","&#38;#244;","&#38;#245;","&#38;#246;","&#38;#247;","&#38;#248;","&#38;#249;","&#38;#250;","&#38;#251;","&#38;#252;","&#38;#253;","&#38;#254;","&#38;#255;");

return str_replace($zeichen,$ersetzung,$string);
}

$Daten file('xml.xml'); // Daten in ein Array einlesen

foreach($Daten as $key => $value){ // Array durchlaufen

$val1 explode('>',$value);  // Werte stehen ja immer nach einem >
if($val1[1]) // Falls des [1] gibt, ist ein Wert vorhanden
{
$val2 explode('<',$val1[1]); // jetzt noch das Ende finden, ist ja immer <
if($val2[0]) // der Wert liegt jetzt im index [0]
{
$Daten[$key]=ereg_replace($val2[0],uni_code($val2[0]),$Daten[$key]);
// Wert kodieren
}

}


}
// ab hier habe ich keine Ahnung, ist der Code von Christian bis auf $Daten_clean
$Daten_clean implode('',$Daten);

$Parser xml_parser_create();
xml_parse_into_struct($Parser$Daten_clean$arrValues$arrIndex);
xml_parser_free($Parser);

echo 
"Index array\n";
print_r($arrIndex);
echo 
"\nVals array\n";
print_r($arrValues);

?>


Hoffe ich konnte Dir helfen.

Daniel

Bitte den Quellcode in der angehängten ZIP-Datei verwenden, da auch hier im Forum Sonderzeichen umgewandelt werden.


Offline  
Read 25. Juni 2007, 16:59:55 #5
Psychokiller

Re: [php][xml] Probleme beim ausgeben von xml mit php.

vielen dank dafür aber epix hat sich jetzt dem problem angenommen und hilft mir.

aber einer sache stimmt bei deinem teil nicht es werden jetzt zwar sonderzeichen richtig angezeigt aber leerzeichen als fragezeichen ^^
Offline  
Seiten: [1]
Gehe zu: