xml auslesen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
all
array
beispiel
code
dank
datei
ding
element
funktion
http
mineral
moment
problem
ressource
schauen
struktur
type
url
versuchen
wissen
-
Huhu!
Vorab möchte ich sagen, dass ich bereits viel gegooglet habe und mich das langsam in den Wahnsinn treibt.
Ich habe vor einiger Zeit aufgehört mich mit php zu beschäftigen, da ich einfach eingesehen habe, dass ich nicht die erforderliche Intelligenz besitze diese und weitere Programmiersprachen zu beherrschen.
Dennoch habe ich nun wieder angefangen, mich mit vermeintlich einfachen Php Dingen zu beschäftigen und zugleich bin ich total frustriert, dass es mir mal wieder für mich unlösbare Probleme bereitet..
Ich möchte eigentlich nur eine Tabelle machen, deren Inhalt mit Werten einer externen XML Datei gefüllt wird.
Folgendes funktioniert:
<? $xmlfile = 'http://api.eve-central.com/api/evemon'; $xml = simplexml_load_file($xmlfile); foreach ($xml->mineral as $a) { $mineral2=$a->name; $value=$a->price; print '<tr>'; print '<td>'.$mineral2.'</td>'; print '<td>'.$value.'</td>'; print '</tr>'; } ?>
Das Problem ist, dass diese xml Datei nicht aktuell ist und ich daher gerne die hier nutzen möchte:
http://api.eve-central.com/api/marketstat?&typeid=34&typeid=35&typeid=36&typeid=37&typeid=38&typeid=39&typeid=40&typeid=11399&usesystem=30000142
Das Problem dabei ist, dass diese XML Datei etwas komplexer ist und ich verstehe auch bedingt wie ich die Werte ansprechen müsste, die ich haben will aber es funktioniert einfach nicht.
Nun habe ich folgendes Probiert aber es klappt nicht..<? $xmlfile = 'http://api.eve-central.com/api/marketstat?usesystem=30000142'; $xml = simplexml_load_file($xmlfile); if (file_exists($xml)) { $path ="/marketstat/type[@id=34]/sell"; if (!$res = $xml->xpath($path)) { echo "Artikel nicht vorhanden!"; } else { echo "<h1>".$res[34]->percentile."</h1>"; } } else { exit("Konnte Datei nicht laden."); } ?>
"Konnte Datei nicht laden" wird ausgegeben.
Ich möchte gerne die Werte in der zweiten XML Datei haben - für jede type id zb. 34 aus dem system 30000142 und zwar unter sell/percentile.
Klar möchte ich nicht dass man mir alles vorkaut aber wie gesagt - das überschreitet einfach meine Kompetenz.
Ich wäre sehr dankbar für eure mühen.
o/
Beitrag zuletzt geändert: 19.2.2013 10:34:12 von nicko -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi,
ich zeig dir mal, wie du das ding analysierst, was du da bekommst.
als erstes minimalcode:
<?php $xmlfile = 'http://api.eve-central.com/api/evemon'; $xml = simplexml_load_file($xmlfile); print_r($xml); ?>
da bekommst du das raus:
SimpleXMLElement Object ( [mineral] => Array ( [0] => SimpleXMLElement Object ( [name] => Tritanium [price] => 5.07 ) [1] => SimpleXMLElement Object ( [name] => Pyerite [price] => 12.43 ) [2] => SimpleXMLElement Object ( [name] => Mexallon [price] => 43.98 ) [3] => SimpleXMLElement Object ( [name] => Isogen [price] => 124.11 ) [4] => SimpleXMLElement Object ( [name] => Nocxium [price] => 667.56 ) [5] => SimpleXMLElement Object ( [name] => Zydrine [price] => 709.42 ) [6] => SimpleXMLElement Object ( [name] => Megacyte [price] => 1936.87 ) [7] => SimpleXMLElement Object ( [name] => Morphite [price] => 5215.86 ) ) )
so, jetzt kenen wir die struktur und ersetzen das print_r(xxx) mit folgendem Code:
foreach ($xml as $ressource) { echo "<br/>$ressource->name: $ressource->price \$"; }
dann kommt das bei raus:
<br/>Tritanium: 5.08 $ <br/>Pyerite: 12.44 $ <br/>Mexallon: 44.05 $ <br/>Isogen: 124.11 $ <br/>Nocxium: 667.56 $ <br/>Zydrine: 709.45 $ <br/>Megacyte: 1936.83 $ <br/>Morphite: 5215.86 $
hoffe, dashilft dir, da durchzublicken. ich denke dein Problem liegt weniger beim PHP sondern im Umgang mit Arrays... -
ja danke dir. soweit kann ich das nachvollziehen.
wenn ich nun aber die http://api.eve-central.com/api/marketstat?&typeid=34&typeid=35&typeid=36&typeid=37&typeid=38&typeid=39&typeid=40&typeid=11399&usesystem=30000142
verwenden möchte und mir die struktur anschaue, wie du es vorgeschlagen hast, steig ich da schon nicht mehr durch.
Mir fehlt einfach das wissen über xml dateien, wie sie aufgebaut sind und funktionieren und wie ich die einzelnen container und werte ansprechen soll.
bei der http://api.eve-central.com/api/evemon ist's ja wirklich total easy und nachvollziehbar aber ich kanns einfach nicht auf die andere anwenden...
ich gebs auf. trotzdem danke
Beitrag zuletzt geändert: 19.2.2013 11:02:02 von nicko -
ok, ich erklär dir die struktur:
über die Type-IDs ziehst du dir irgentwelche elemente aus dem Marketplace. Bedingung in einem XML-Dokument ist, dass die struktur gleich ist, also alle Objekte in diesem Marketplace-Container gleic sind. das ermöglicht erst die verarbeitung der einzelnen Objekte.
wenn du den
http://api.eve-central.com/api/marketstat?
so aufrufst, hast du da keine Elemente drin. erst durch übergeben der typ-parameter-liste, nimmt er diese IDs auf und setzt sie zwischen die Market-place-tags(nummeriertes Array.
http://api.eve-central.com/api/marketstat?typeid=34
damit hättest du ein Objekt 34, welches 3 über-Eigenschaften hat, nämlich buy, sell und all welche jeweils untereigenschaften haben, nämlich(assoziiatives Array):
<volume> <avg> <max> <min> <stddev> <median> (auch assoziatives Array)
in diesen Tags sind dann die den jeweiligen eigenschaften Werten zugeordnet.
und wenn du nun andere typeids anforderst, siehst du, dass alle gleich aufgebaut sind.
wenn du dann angibst: http://api.eve-central.com/api/marketstat?typeid=34&typeid=35
hast du dann elemente 34 und 35 aufgelistet, die gleich aufgebaut sind. bei
$xmlfile = 'http://api.eve-central.com/api/marketstat?typeid=34&typeid=35'; $xml = simplexml_load_file($xmlfile); print_r($xml);
sieht das print_r ($xml) dann so aius:
SimpleXMLElement Object ( [@attributes] => Array ( [method] => marketstat_xml [version] => 2.0 ) [marketstat] => SimpleXMLElement Object ( [type] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 34 ) [buy] => SimpleXMLElement Object ( [volume] => 164371917599 [avg] => 4.94 [max] => 8.12 [min] => 1.57 [stddev] => 0.97 [median] => 5.28 [percentile] => 5.96 ) [sell] => SimpleXMLElement Object ( [volume] => 101906470673 [avg] => 6.47 [max] => 20.00 [min] => 3.20 [stddev] => 1.35 [median] => 6.04 [percentile] => 5.23 ) [all] => SimpleXMLElement Object ( [volume] => 278090616562 [avg] => 5.34 [max] => 15.60 [min] => 0.20 [stddev] => 1.39 [median] => 5.58 [percentile] => 1.29 ) ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 35 ) [buy] => SimpleXMLElement Object ( [volume] => 75610806770 [avg] => 11.47 [max] => 16.00 [min] => 3.50 [stddev] => 2.92 [median] => 12.86 [percentile] => 15.22 ) [sell] => SimpleXMLElement Object ( [volume] => 12957762388 [avg] => 14.76 [max] => 50.00 [min] => 6.99 [stddev] => 3.37 [median] => 15.00 [percentile] => 9.42 ) [all] => SimpleXMLElement Object ( [volume] => 99615685049 [avg] => 10.81 [max] => 30.99 [min] => 0.18 [stddev] => 3.76 [median] => 12.70 [percentile] => 1.18 ) ) ) ) ) <br/>
da siehst du die struktur. wir haben 2 Hauptknoten, das sind @attributes und der marketplace, auf den marketplace wollen wir zugreifen, also müssen wir in den knoten rein über
$xml->marketplace
der code, um dann die elemente aufzulisten wäre dann:
$xmlfile = 'http://api.eve-central.com/api/marketstat?typeid=34&typeid=35'; $xml = simplexml_load_file($xmlfile); foreach ($xml->marketstat->type as $ressource) { echo '<br/>Type ' . $ressource['id'] . ":\t" . $ressource->buy->avg . " \$\n"; }
so, den $xmlfile string kannst du dir so zusammenbauen, dass du alle gewünschten Parameter drin hast...
hoffe, das hilft dir etwas mehr weiter -
danke, das hat mir schon weiter geholfen.
das ist es eben was mir fehlt, zu wissen wie ich auf die einzelnen - ich nenne sie mal "unterordner" - zugreifen kann..
($xml->marketstat->type)
ich habe es nun soweit auch hinbekommen - ich hoffe dass ich scripting mäßig auch alles richtig gemacht habe aber ein problem habe ich noch.
Ich habe nun versucht den Id's namen zuzuweisen indem ich str_replace verwendet habe:
http://nicko.lima-city.de/test1/minerals.php
das Problem ist die ID von Morphite (11399)
da die 39 durch Zydrine ersetzt wird steht da nun 11Zydrine9
Ich müsste wohl eine str_replace_once function schreiben aber dafür bin ich auch mal wieder zu inkompetent.
gibt es noch eine andere möglichkeit als str_replace?
Das ich die Zahlen irgendwie als feste Variable habe - das ging doch aber mit zahlen nicht, wenn ich das richtig erinnere?
$tritanium="34"; irgendwie sowas
Ich habe bereits functionen gefunden, um str_replace_once zu erzeugen aber ich bin einfach zu blöd das bei mir einzubauen.
*seufz*
Beitrag zuletzt geändert: 19.2.2013 18:15:05 von nicko -
Huhu,
ich hab jetzt mal die Funktion von sebulon nachgebaut, und Deine Tabelle dabei beachtet.
Das Ergebnis sieht so aus:
http://menschle.lima-city.de/testkram_fuer_bla/nicko/
Der Quelltext:
<style type="text/css"><!-- td {text-align:right;} .id {color:black; font-weight:bold;} .buy {color:red;} .sell {color:green;} .all {color:blue;} --> </style> <?php $xmlfile = 'http://api.eve-central.com/api/marketstat?&typeid=34&typeid=35&typeid=36&typeid=37&typeid=38&typeid=39&typeid=40&typeid=11399&usesystem=30000142'; $xml = simplexml_load_file($xmlfile); echo "<table cellspacing='0' cellpadding='3' border='0'>\n<tr>\n<td></td>\n<td class='id'>id</td>\n<td>volume</td>\n<td>avg</td>\n<td>max</td>\n<td>min</td>\n<td>stddev</td>\n<td>median</td>\n<td>percentile</td></tr>\n"; foreach ($xml->marketstat->type as $ressource) { echo "<tr class='buy'>\n<td>buy</td>\n"; echo "<td class='id' rowspan=3>" . $ressource['id'] . "</td>\n"; echo "<td>" . $ressource->buy->volume . "</td>\n"; echo "<td>" . $ressource->buy->avg . " \$</td>\n"; echo "<td>" . $ressource->buy->max . " \$</td>\n"; echo "<td>" . $ressource->buy->min . " \$</td>\n"; echo "<td>" . $ressource->buy->stddev . "</td>\n"; echo "<td>" . $ressource->buy->median . " \$</td>\n"; echo "<td>" . $ressource->buy->percentile . "</td>\n</tr>\n"; echo "<tr class='sell'>\n<td>sell</td>\n"; echo "<td>" . $ressource->sell->volume . "</td>\n"; echo "<td>" . $ressource->sell->avg . " \$</td>\n"; echo "<td>" . $ressource->sell->max . " \$</td>\n"; echo "<td>" . $ressource->sell->min . " \$</td>\n"; echo "<td>" . $ressource->sell->stddev . "</td>\n"; echo "<td>" . $ressource->sell->median . " \$</td>\n"; echo "<td>" . $ressource->sell->percentile . "</td>\n</tr>\n"; echo "<tr class='all'>\n<td>all</td>\n"; echo "<td>" . $ressource->all->volume . "</td>\n"; echo "<td>" . $ressource->all->avg . " \$</td>\n"; echo "<td>" . $ressource->all->max . " \$</td>\n"; echo "<td>" . $ressource->all->min . " \$</td>\n"; echo "<td>" . $ressource->all->stddev . "</td>\n"; echo "<td>" . $ressource->all->median . " \$</td>\n"; echo "<td>" . $ressource->all->percentile . "</td>\n</tr>\n"; echo "<tr>\n<td colspan='9'> </td>\n</tr>\n"; } echo '</table>'; ?>
Vielleicht hilfts ja was ;) -
huhu, danke!!
ja das ist cool. so viel mühe hättest du dir aber garnicht machen müssen. :/
naja gut ich weiß nicht, ob ich die ganzen werte alle vielleicht doch mal brauchen werde aber hauptsächlich interessierte mich im moment der sell/percentile wert.
so ähnlich sieht es bei mir auch aus nur habe ich eben immernoch das Problem mit dem Morphite (11Zydrine9) :/
Beitrag zuletzt geändert: 19.2.2013 18:53:53 von nicko -
hi,
dafür gibt es eine ganz einfache lösung.
erstmal ein Tadel: wenn eine ID als ganzes behandelt wird, schneidet man sich das nicht über string_Replace raus! man benutzt die ID als ganzes.
ich würde dir vorschlagen, eine Funktion zu schreiben nach folgendem Muster:
function ersetze_id($id) { switch($id) { case 34: return "Napalm"; case 35: return "Plasmid"; case 11399: return "Morphite"; case 39: return "Zydrine"; default: return "irgendwasanderes Brennbares"; } }
und da wo du es brauchst übergibst du dann einfach die ID an die funktion, wie zum beispiel in menschles ausgearbeitetem Codebeispiel:
echo "<td class='id' rowspan=3>" . ersetze_id($ressource['id']) . "</td>\n";
und dann hättest du dein Problem eigentlich gelöst...
mein funktionierendes beispiel siehst du unter http://sebulon.lima-city.de/test/
quellcode habe ich oben gepostet, modifikation siehst du in diesem Post. hoffe, das hilft und löst dein Problem endgültig (vor allem Verstädnisproblem). und in Zukunft einfach schauen: komische Arrays erstmal mit print_r($taget) anzeigen lassen, dann auseinandernehmen. @attributes gibt an, dass mit dem Subscriptionsoperator['Eigenschaft'] gearbeitet wird, der rest geht über pointer -> also eigentlich recht banal die geschichte... man muss nur schauen, in welchen regelmäißgkeiten das ding sich bewegt, um es entsprechend auswerten zu können
Beitrag zuletzt geändert: 19.2.2013 23:40:36 von sebulon -
ohh okay. gestern hatte bei mir dein link leider nur eine weiße seite gezeigt.
das mit dem str_replace schien mir selbst eine sehr unangebrachte lösung zu sein, allerdings wusste ich mir auch nicht anders zu helfen..
Ich werde deine Ratschläge gleich mal versuchen umzusetzen.
Vielen Dank :> -
hm, merkwürdig, bei mir hat er es nach dem 2. aufruf auch erst richtig angezeigt...
egal...
bei der switch-case solltest du jedoch den Text noch an deine belange anpassen, sonst kommt da mumpitz raus^^ -
soo, habe es nun so weit hinbekommen, wie ich es mir gewünscht habe ;)
Danke für deine Hilfe.
Nun kann ich endlich anfangen mich mit den API's auseinanderzusetzen, was vermutlich auch wieder eine Katastrophe wird =D
so sieht es nun bei mir aus und so hatte ich es gedacht - danke nochmals :>
http://nicko.lima-city.de/test1/minerals.php
*freu*
Beitrag zuletzt geändert: 21.2.2013 11:03:50 von nicko -
Hiho!
Es tut mir leid, wenn ich diesen Thread wieder hochschiebe aber ich habe ein ähnliches Problem
und da ich ein wenig mit den Scripten in diesem thread herumprobiert habe, möchte ich nicht extra einen neuen Thread erstellen.
Ich versuche mich derzeit auch mit dem Auslesen von xml Documenten und habe hier einige Scripte nachgelesen und ausprobiert, um meine eigenen Erfahrungen zu machen und zu lernen.
Wenn ich das richtig verstehe wird hier beim Auslesen des xml Documents
foreach benutzt. Also eine Schleife, die alle Daten ausgibt, bis keine mehr da sind.
Ich versuche im moment einzelne Werte auszugeben und scheitere dadran.
Wenn ich jetzt zum Beispiel aus der type id 39 eine speziellen Wert wiedergeben möchte und nicht die aller type id's, da versteh ich irgendwie nicht wie ich das machen kann.
Ob mir da jemand einen Denkanstoß geben könnte?
Vielen Dank,
Michelle
Beitrag zuletzt geändert: 21.3.2013 17:42:13 von lunaticfay -
Wenn du etwas komplexere Dinge mit XML in PHP anstellen möchtest könntest du dir querypath ansehen. Das Problem mit der Type-ID lässt sich dann z.B. so lösen (ungetestet)
$buy_volume = qp($xmlcode)->find('type[id="39"] > buy > volume')->text();
-
Hey!
Also das hat bei mir nicht geklappt und so richtig kann ich damit auch nichts anfangen..
Ich habe wegen qp mal etwas gegoogelt, weil mir dies unbekannt war und stoße dabei in diesem Zusammenhang immer auf
require 'QueryPath/QueryPath.php';
bedeutet das nicht, ich muss die Query Path Library installiert haben?
Eine Datei Namens QueryPath.php habe ich nämlich nicht..
mfg Michelle -
lunaticfay schrieb:
Ja, die musst du dir herunterladen. Wenn du die von mir verlinkte Seite angesehen hättest wäre dir bestimmt aufgefallen, dass man die Bibliothek von dort herunterladen kann
bedeutet das nicht, ich muss die Query Path Library installiert haben?
Eine Datei Namens QueryPath.php habe ich nämlich nicht.
You can either download a stable release from the GitHub Tags page or you can use git to clone this repository and work from the code.
[…]
From the download or git clone:<?php require 'QueryPath/src/QueryPath/qp.php'; ?>
Und hier ist nochmals der Link -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage