PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten aus XML in Namespace lesen


Schnueffler
18.05.2007, 09:58:44
Hallo

Ich versuche schon seit einiger Zeit eine XML-Datei in PHP zu parsen. Leider habe ich bis jetzt immer noch Probleme mit den Daten, die in einem bestimmten Namespace liegen.

Ich möchte eine GPX-Datei einlesen und mit einer anderen GPX vergleichen. Wenn die Daten in der zweiten Datei nicht vorhanden sind, dann sollen Sie dort eingefügt werden. Das Einlesen klappt auch soweit sehr gut, nur leider komme ich nicht an die Daten ran, die im Namespace "groundspeak" liegen. Wie kann ich diese Daten lesen und in der Zeildatei auch wieder genauso einfügen?


<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<gpx xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" version="1.0" creator="Groundspeak Pocket Query" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0 http://www.groundspeak.com/cache/1/0/cache.xsd">
<name>All New</name>
<desc>Geocache file generated by Groundspeak</desc>
<author>Groundspeak</author>
<time>2007-02-13T21:49:49.2832334-08:00</time>
<keywords>cache, geocache, groundspeak</keywords>
<bounds minlat="42.765117" minlon="6.0872" maxlat="54.612" maxlon="18.430167"/>

<wpt lat="50.076033" lon="10.753183">
<time>2007-03-24T00:00:00.0000000-08:00</time>
<name>GCKB4O</name>
<desc>Haßberg Stammtisch... by coldfinger, Event Cache (1.5/1)</desc>
<url>http://www.geocaching.com/seek/cache_details.aspx?guid=c6378fa0-c289-4e73-bc98-4d1245d0d759</url>
<urlname>Haßberg Stammtisch...</urlname>
<sym>Geocache</sym>
<type>Geocache|Event Cache</type>

<groundspeak:cache xmlns:groundspeak="http://www.groundspeak.com/cache/1/0" id="165626" available="True" archived="False">
<groundspeak:name>Haßberg Stammtisch...</groundspeak:name>
<groundspeak:placed_by>coldfinger</groundspeak:placed_by>
<groundspeak:owner id="100787">coldfinger</groundspeak:owner>
<groundspeak:type>Event Cache</groundspeak:type>
<groundspeak:container>Not chosen</groundspeak:container>
<groundspeak:difficulty>1.5</groundspeak:difficulty>
<groundspeak:terrain>1</groundspeak:terrain>
<groundspeak:country>Germany</groundspeak:country>
<groundspeak:state>
</groundspeak:state>
<groundspeak:short_description html="False">Eine Einladung zu einem regelmäßigen Stammtisch. Nächster Termin: Samstag, 24.03.07 18:00</groundspeak:short_description>
<groundspeak:long_description html="False">

</groundspeak:long_description>

<groundspeak:encoded_hints></groundspeak:encoded_hints>

<groundspeak:logs>
<groundspeak:log id="22937864">
<groundspeak:date>2007-01-29T08:00:00</groundspeak:date>
<groundspeak:type>Write note</groundspeak:type>
<groundspeak:finder id="100787">coldfinger</groundspeak:finder>
<groundspeak:text encoded="False">Vielen Dank</groundspeak:text>
</groundspeak:log>
</groundspeak:logs>

</groundspeak:cache>
</wpt>
</gpx>

Schnueffler
21.05.2007, 10:31:58
Ist niemand da, der mit mit meinem Problem helfen kann????

meikel (†)
23.05.2007, 07:46:38
Ist niemand da, der mit mit meinem Problem helfen kann????
Ohne Script?

Schnueffler
23.05.2007, 11:08:24
<?php
//globale Einstellungen
$DEBUG = 0; # aktiviert die Debugausgabe, während des mergens
$DELTEFILE = 1; # löscht die Datei temporäre Datei nach dem Verarbeiten

?>



<?php
function OpenGPX($filename)
{
if (!file_exists($filename))
die ("Die Datei ($filename) existiert nicht.");
$XML = simplexml_load_file($filename);

if (!$XML)
die ("Kann die Datei ($filename) nicht öffnen.");
return $XML;
}

function MergeWaypoint(SimpleXMLElement &$xml1, SimpleXMLElement $xml2, $counter)
{
$dom1 = new DomDocument();
$dom2 = new DomDocument();
$dom1->loadXML($xml1->asXML());
$dom2->loadXML($xml2->wpt[$counter]->asXML());

$xpath = new domXPath($dom2);
$xpathQuery = $xpath->query('/*/*');

$node = $dom1->createElement("wpt");
$Sub = $dom1->documentElement->appendChild($node);
$Sub->setAttribute("lat", (string)$xml2['lat']);
$Sub->setAttribute("lon", (string)$xml2['lon']);

for ($i = 0; $i < $xpathQuery->length; $i++)
$Sub->appendChild($dom1->importNode($xpathQuery->item($i), true));

$xml1 = simplexml_import_dom($dom1);
}



function deleteLogEntries(SimpleXMLElement &$xml)
{
$doc = new DOMDocument;

$doc->loadXML($xml->asXML());
$nodeList = $doc->getElementsByTagNameNS('http://www.groundspeak.com/cache/1/0', 'logs');
foreach($nodeList as $element)
$element->parentElement->removeChild($nodeList);

#unset($element);


#$xp = new DOMXPath($doc);
# $nodeList = $xp->query('groundspeak:logs');//DOMXPath::query() liefert eine DOMNodeList zurück

}


?>

<html>
<head>
</head>


<body>
<?PHP
$uploaddir = 'upload/';
$Databasefile = 'Database.gpx';
$MergedWaypoints = 0;
$counter = 0;

if (!file_exists($uploaddir)) mkdir($uploaddir,0777);

#Datei wurde hochgeladen
if(isset($_POST['send']) && $_POST['send'] == "ja")
{
if ($DEBUG)
echo $_FILES['userfile']['tmp_name'] . "<br>\n";
#Erzeugen eines eindeutigen Dateinamens ...
$tmpfname = tempnam (realpath($uploaddir), 'GPX_');
if ($DEBUG) echo $tmpfname . "<br>\n";

#...und umkopieren in das Upload-Dir
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $tmpfname))
if ($DEBUG)
echo "Datei erfolgreich hochgeladen.<br>\n";
else
{
if ($DEBUG)
{
echo "Fehler beim Hochladen der Datei. Fehlermeldung:\n<br />";
print_r($_FILES);
}
}

#Öffnen der neuen und existieren GPX-Datei zum Vergleich
$XMLSource = OpenGPX($tmpfname);
$XMLDest = OpenGPX($Databasefile);

#Vergleichen, ob ein neuer WP schon vorhanden ist
if ($DEBUG)
echo 'Datei ' . $tmpfname .' wird bearbeitet.<br>'."\n";

echo 'Datei wird in die Datenbank gemerged:<br>'."\n";
foreach ($XMLSource->wpt as $SourceWaypoint)
{

$found = false;

if ($DEBUG)
echo "<br>Source: ".($SourceWaypoint->name)."<br>";
foreach ($XMLDest->wpt as $DestWaypoint)
{
if ($DEBUG)
echo "DB: ".($DestWaypoint->name)."<br>";
if ((string)($SourceWaypoint->name) == (string)($DestWaypoint->name))
{
$found = true;
break;
}
}
if (!$found)
{
MergeWaypoint($XMLDest, $XMLSource, $counter);
$MergedWaypoints++;
}
$counter++;
}
echo "<br><br>".'Es wurde'.($MergedWaypoints>1?'n ':' ') . $MergedWaypoints . ' Waypoint' . ($MergedWaypoints>1?'s':'') . ' in die Zieldatei gemerged.';

#Entfernen der Logeinträge
deleteLogEntries($XMLDest);

#Speichern der geänderten Daten
$XMLDest->asXML("Result.gpx");

#Löschen der temporären Datei nachdem sie bearbeitet wurde
if ($DELTEFILE)
unlink($tmpfname);
?>
<br><br><a href="<?PHP echo $PHP_SELF; ?>">Noch eine Datei hochladen</a>

<?php
}
else
{
?>

<form enctype="multipart/form-data" action="<?PHP echo $PHP_SELF; ?>" method="post">
<input type="file" name="userfile" />
<input type="hidden" name="send" value="ja" />
<input type="submit" value="Datei hochladen" />
</form>

<?php
}
?>

</body>
</html>



Zum Testen hatte ich noch mal ein gekürztes Script geschrieben, mit welchem ich veruscht habe, auf den NS zuzugreifen. Leider ging das nicht so ganz.
<?php

$dom = new DOMDocument;

// load the XML string defined above
$dom->load("Result2.gpx");

foreach ($dom->getElementsByTagNameNS('http://www.groundspeak.com/cache/1/0', 'logs') as $element)
{
echo 'local name: ', $element->localName, ', prefix: ', $element->prefix, ', Value: ', $element->nodeValue, "<br>\n";
}

?>


Das Problem ist, dass das Ganze schon 2 Montae her ist, und bis jetzt aufgrund meines Umzuges brach lag. Daher bin ich nicht mehr ganz so in den Scripten drin und weiss auch nicht mehr, wie der aktuelle Stand aussah. Aber ich hoffe, dass ihr mir trotzdem helfen könnt.

meikel (†)
23.05.2007, 19:49:47
Aber ich hoffe, dass ihr mir trotzdem helfen könnt.
Das ist die Frage, ob es hier jemanden gibt, der sich genauer mit gpx auskennt.

Schnueffler
29.08.2007, 17:27:47
Lang lang ist'e her, dass ich diese Anfrage gestellt habe. Leider habe ich bis jetzt immer noch keine Lösung. Hat jemand von Euch noch ne Idee, wie ich an meine Daten kommen kann?

defabricator
03.09.2007, 00:20:37
Also ich habe Dein Testskript mit den Daten aus dem ersten Post getestet (php 5.2.3) und es gibt aus:local name: logs, prefix: groundspeak, Value:

2007-01-29T08:00:00
Write note
coldfinger
Vielen Dank

<br>Ist das nicht das gewünschte Ergebnis?

defabricator
03.09.2007, 00:21:14
Das ist die Frage, ob es hier jemanden gibt, der sich genauer mit gpx auskennt.nein, das ist eine reine xml/php Frage.

meikel (†)
03.09.2007, 00:55:21
nein, das ist eine reine xml/php Frage.
Aha...
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<gpx xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" version="1.0" creator="Groundspeak Pocket Query" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0 http://www.groundspeak.com/cache/1/0/cache.xsd">
<name>All New</name>

defabricator
03.09.2007, 01:23:19
Und? Das ist eine xml Datei. Und die Frage ist nur, wie man mit php aus einer xml Datei Elemente eines bestimmten Namespaces auswählt bzw wie man deren Daten herankommt.
Wer sich mit der Verarbeitung von XML Daten in PHP ein wenig auskennt, kann die Frage ohne besondere Kenntnisse des konkreten Formats beantworten.
Allerdings glaube ich, der OP hat sich die Frage im Grunde bereits selbst beantwortet, denn das Testskript gibt auf meinem Rechner das (scheint mir zumindest so) richtige Ergebnis aus.