akrosh
Goto Top

Externe XML-Datei in PHP auslesen

Hallo,

ich habe eine Frage zu XML und PHP.

Ich habe eine externe XML-Datei die ich per PHP auslesen und ausgeben will.
Irgendwie macht sich das jedoch nicht so einfach ...

Ich habe diverse Dinge gegooglet aber konnte die Beispiele nicht auf mein Szenario anwenden.

Ich habe nen Apache 2 auf Debian, PHP-7.0.

Kann mir jemand einen Denkanstoß geben wie genau das läuft?

Content-ID: 319900

Url: https://administrator.de/contentid/319900

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

StefanKittel
StefanKittel 03.11.2016 um 14:55:50 Uhr
Goto Top
Hallo,

file_get_contents oder CURL.

Je nachdem was Dein Provider gesperrt hat und was nicht.

Setfan
Akrosh
Akrosh 03.11.2016 um 15:04:26 Uhr
Goto Top
Provider hab ich in dem Fall keinen, der Server ist in unsere Infrastruktur intigriert.

Was ich hätte erwähnen sollen:

Ich will nicht die komplette XML-Datei auslesen, nur einen Teil mit Sensorwerten.
Ginge das damit?
131381
131381 03.11.2016 aktualisiert um 15:23:07 Uhr
Goto Top
Ich will nicht die komplette XML-Datei auslesen, nur einen Teil mit Sensorwerten.
Kein Problem mit dem SimpleXMLElement

Gruß
StefanKittel
StefanKittel 03.11.2016 um 15:55:28 Uhr
Goto Top
Hallo,

downloadden musst Du die schon komplett.
Und dann per XML nur das Element was Du brauchst.

Stefan
Akrosh
Akrosh 09.11.2016 um 07:09:52 Uhr
Goto Top
Ich kann SimpleXML irgendwie nicht nutzen ...
Ich habe eine komplette Beispieldatei verwendet aber die Ausgabe ist leer, er ignoriert den Teil einfach!
Gibts noch irgendwas zu beachten oder muss ich das seperat aktivieren?
StefanKittel
StefanKittel 09.11.2016 um 07:42:57 Uhr
Goto Top
Moin

Zitat von @Akrosh:
Gibts noch irgendwas zu beachten oder muss ich das seperat aktivieren?
Eigentlich nicht.

Schau mal ob die Lib funktioniert indem Du eine einfache XML erstellst und ausgibst.
Dann probier mal eine einfache Beispieldatei zu importieren.

Vieleicht ist Deine XML "ungültig" formatiert.
Es gibt durchaus Nuancen bei XMLs.

Stefan
Akrosh
Akrosh 10.11.2016 um 12:39:55 Uhr
Goto Top
Keine Chance, die Ausgabe der XML-Datein ist immer leer.

Ich habe nachfolgendes XML-Beispiel intigriert:

<?php
$string = <<<XML
<a>
 <b>
  <c>text</c>
  <c>zeugs</c>
 </b>
 <d>
  <c>code</c>
 </d>
</a>
XML;

$xml = new SimpleXMLElement($string);

/* Suche nach <a><b><c> */
$result = $xml->xpath('/a/b/c');  

while(list( , $node) = each($result)) {
    echo '/a/b/c: ',$node,"\n";  
}

/* Relative Pfade funktionieren ebenfalls ... */
$result = $xml->xpath('b/c');  

while(list( , $node) = each($result)) {
    echo 'b/c: ',$node,"\n";  
}
?>

Aber auch hier war die Ausgabe leer.
131381
131381 10.11.2016 aktualisiert um 12:54:10 Uhr
Goto Top
<?php
$xmlstring = '<?xml version="1.0" encoding="utf-8"?><a><b><c>text</c><c>zeugs</c></b><d><c>code</c></d></a>';  
$xml = simplexml_load_string($xmlstring);
$result = $xml->xpath('/a/b/c');  
foreach($result as $itm){
    echo $itm . "<br/>";  
}
?>
Geht einwandfrei ...
Akrosh
Akrosh 14.11.2016 um 08:40:43 Uhr
Goto Top
Auch bei dem Beispiel bleibt alles leer, irgenwo muss mir da wohl noch etwas fehlen.
131381
131381 14.11.2016 aktualisiert um 08:58:13 Uhr
Goto Top
Dann fehlt dir das PHP-XML Modul oder du hast eine vollkommen veraltete PHP Version..
Ein phpinfo(); zeigts dir!
Und schalte das error reporting ein. Das Beispiel geht aber definitiv.
Akrosh
Akrosh 14.11.2016 um 14:28:45 Uhr
Goto Top
Habe nun nochmal alles gecheckt und das XML-Modul erneut installiert.

Jetzt funktioniert das Beispiel auch.
Aber ich verstehe anhand der Beispiele nicht wie ich div. Teile meiner XML-Datei auslesen kann.

Hier mal die XML-Datei:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
<alarmmanager>
<device>AlarmManager PRO</device>
<time>November 14,2016 14:26:27</time>
<config>
<armdelay>5</armdelay>
<sensorflags>2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</sensorflags>
</config>
<state>
<alarm1>0</alarm1>
<alarm2>0</alarm2>
<serverstate>0</serverstate>
<communication>0</communication>
<extalarm>0</extalarm>
<extalarmarmed>0</extalarmarmed>
<extpower>0</extpower>
<sabotage>0</sabotage>
<gsm>
<state>1</state>
<strength>3</strength>
<pinactive>1</pinactive>
<pinstate>1</pinstate>
</gsm>
<mykentix>
<connection>2</connection>
<clients>0</clients>
</mykentix>
</state>
<alarmzones>
<alarm>0</alarm>
<alarmzone>
<name>Schulstrasse 2. OG</name>
<state>0</state>
<alarm1>0</alarm1>
<delay error="0">0</delay>  
</alarmzone>
<alarmzone>
<name>Schulstrasse KG</name>
<state>0</state>
<alarm1>0</alarm1>
<delay error="0">0</delay>  
</alarmzone>
<alarmzone>
<name>Rathwege BG 4</name>
<state>0</state>
<alarm1>0</alarm1>
<delay error="0">0</delay>  
</alarmzone>
<alarmzone>
<name>Rathwege BG 1</name>
<state>0</state>
<alarm1>0</alarm1>
<delay error="0">0</delay>  
</alarmzone>
</alarmzones>
<sensors>
<alarm>0</alarm>
<multisensor>
<device>AlarmManager</device>
<id>00409D954276</id>
<type>99</type>
<zone>1</zone>
<alarm>0</alarm>
<armerror>0</armerror>
<values>
<temperature unit="°C" alarm="0">-</temperature>  
<humidity unit="%" alarm="0">-</humidity>  
<dewpoint unit="°C" alarm="0">-</dewpoint>  
<motion unit="%" alarm="0">-</motion>  
<co unit="%" alarm="0">-</co>  
<digin1 unit="" alarm="0">0</digin1>  
<digin2 unit="" alarm="0">0</digin2>  
<extpower unit="" alarm="0">0</extpower>  
<connection unit="" alarm="0">0</connection>  
<vibration unit="" alarm="0">0</vibration>  
<sabotage unit="" alarm="0">0</sabotage>  
</values>
</multisensor>
<multisensor>
<device>Serverraum Schulstrasse 2. OG</device>
<id>000D6F000B12A9EE</id>
<type>01</type>
<zone>1</zone>
<alarm>0</alarm>
<armerror>0</armerror>
<values>
<temperature unit="°C" alarm="0">18.4</temperature>  
<humidity unit="%" alarm="0">38.8</humidity>  
<dewpoint unit="°C" alarm="0">4.1</dewpoint>  
<motion unit="%" alarm="0">0.0</motion>  
<co unit="%" alarm="0">0</co>  
<digin1 unit="" alarm="0">0</digin1>  
<digin2 unit="" alarm="0">0</digin2>  
<extpower unit="" alarm="0">0</extpower>  
<connection unit="" alarm="0">0</connection>  
<vibration unit="" alarm="0">0</vibration>  
<sabotage unit="" alarm="0">0</sabotage>  
</values>
</multisensor>
<multisensor>
<device>Serverraum Schulstrasse Keller</device>
<id>00409D957287</id>
<type>10</type>
<zone>2</zone>
<alarm>0</alarm>
<armerror>0</armerror>
<values>
<temperature unit="°C" alarm="0">19.2</temperature>  
<humidity unit="%" alarm="0">26.6</humidity>  
<dewpoint unit="°C" alarm="0">0.4</dewpoint>  
<motion unit="%" alarm="0">0.0</motion>  
<co unit="%" alarm="0">0</co>  
<digin1 unit="" alarm="0">0</digin1>  
<digin2 unit="" alarm="0">0</digin2>  
<extpower unit="" alarm="0">0</extpower>  
<connection unit="" alarm="0">0</connection>  
<vibration unit="" alarm="0">0</vibration>  
<sabotage unit="" alarm="0">0</sabotage>  
</values>
</multisensor>
<multisensor>
<device>Serverraum Rathwege BG 4</device>
<id>00409D95728C</id>
<type>10</type>
<zone>3</zone>
<alarm>0</alarm>
<armerror>0</armerror>
<values>
<temperature unit="°C" alarm="0">18.4</temperature>  
<humidity unit="%" alarm="0">33.8</humidity>  
<dewpoint unit="°C" alarm="0">2.2</dewpoint>  
<motion unit="%" alarm="0">0.0</motion>  
<co unit="%" alarm="0">0</co>  
<digin1 unit="" alarm="0">0</digin1>  
<digin2 unit="" alarm="0">0</digin2>  
<extpower unit="" alarm="0">0</extpower>  
<connection unit="" alarm="0">0</connection>  
<vibration unit="" alarm="0">0</vibration>  
<sabotage unit="" alarm="0">0</sabotage>  
</values>
</multisensor>
<multisensor>
<device>Serverraum Rathwege BG 1</device>
<id>00409D972E26</id>
<type>10</type>
<zone>4</zone>
<alarm>0</alarm>
<armerror>0</armerror>
<values>
<temperature unit="°C" alarm="0">24.2</temperature>  
<humidity unit="%" alarm="0">23.3</humidity>  
<dewpoint unit="°C" alarm="0">2.0</dewpoint>  
<motion unit="%" alarm="0">0.0</motion>  
<co unit="%" alarm="0">0</co>  
<digin1 unit="" alarm="0">0</digin1>  
<digin2 unit="" alarm="0">0</digin2>  
<extpower unit="" alarm="0">0</extpower>  
<connection unit="" alarm="0">0</connection>  
<vibration unit="" alarm="0">0</vibration>  
<sabotage unit="" alarm="0">0</sabotage>  
</values>
</multisensor>
</sensors>
<servermonitoring>
<alarm>0</alarm>
</servermonitoring>
<networkmonitoring>
<alarm>0</alarm>
</networkmonitoring>
<cameras>
<camera>
<device>Serverraum Schulstrasse KG</device>
<ip>192.168.230.112</ip>
<port>80</port>
<zone>2</zone>
</camera>
<camera>
<device>Serverraum Rathwege BG 4</device>
<ip>192.168.233.110</ip>
<port>80</port>
<zone>3</zone>
</camera>
<camera>
<device>Serverraum Rathwege BG 1</device>
<ip>192.168.233.112</ip>
<port>80</port>
<zone>4</zone>
</camera>
<camera>
<device>Serverraum Schulstrasse 2. OG</device>
<ip>192.168.230.110</ip>
<port>80</port>
<zone>1</zone>
</camera>
</cameras>
</alarmmanager>
131381
131381 14.11.2016 aktualisiert um 14:32:54 Uhr
Goto Top
Zitat von @Akrosh:
Aber ich verstehe anhand der Beispiele nicht wie ich div. Teile meiner XML-Datei auslesen kann.
XPATH is the key face-smile
Akrosh
Akrosh 14.11.2016 um 15:20:51 Uhr
Goto Top
Dafür bin ich sichtlich zu blöd!

Die XML-Dateien in den Beispielen sind irgendwie immer in das Dokument intigriert ... und wenn ich das via include reinhole dann gehts nicht mehr ...
Da sich die Daten innerhalb der XML immer ändern kann ich die nicht rein kopieren ...
131381
131381 14.11.2016 aktualisiert um 15:41:14 Uhr
Goto Top
Zitat von @Akrosh:
Dafür bin ich sichtlich zu blöd!
Aha... da machts sich sichtlich wieder einer einfach ...
Die XML-Dateien in den Beispielen sind irgendwie immer in das Dokument intigriert ... und wenn ich das via include reinhole dann gehts nicht mehr ...
Da sich die Daten innerhalb der XML immer ändern kann ich die nicht rein kopieren ...
Wir wissen ja noch nicht mal was du aus dem Dokument brauchst face-sad.
Meine Güte schon wieder Freidaach oder was? Knallt hier nen XML hin ohne zu schreiben was gemacht werden soll oder was das Ziel ist face-sad

Die XML-Dateien in den Beispielen sind irgendwie immer in das Dokument intigriert ...

Natürlich benutzt man dann stattdessen die Methode
simplexml_load_file() wenn man aus einer Datei lesen will! Nix mit include ...
Akrosh
Akrosh 14.11.2016 aktualisiert um 15:49:24 Uhr
Goto Top
Schön wärs aber ich begreife eben nicht wo der Unterschied ist!

Einmal habe ich die Möglichkeit das Dokument per simplexml_load_file einzulesen, was gut funktioniert jedoch unaufbereitet erstmal schwer zu lesen ist.

realisiert sieht das so aus:
<?php
$xmlfile='http://192.168.231.185/xml/values.xml';  
$xml = simplexml_load_file($xmlfile);
print_r($xml);
?>

Nun versuche ich alles unter <sensor></sensors> zu verarbeiten und in eine Tabelle zu legen um es grafisch ein wenig verständlicher darzustellen.
Jedoch endet das eben nie so wie gewollt sonder bleibt einfach leer.

Was bei mir mit der URL beginnt, startet bei den Beispielen immer wie folgt:

$xmlfile = <<<XML
und hier würde jetzt meine XML stehen

Und das zu kombinieren gelingt mir nicht, ich habe vorher noch nie mit XML gearbeitet und daher verstehe ich die Auswertung nicht.

Um überhaupt mal einen Abschnitt aus der XML-Datei auszulesen habe ich es nun so versucht:

<?php
$xmlfile='http://192.168.231.185/xml/values.xml';  
$xml = simplexml_load_file($xmlfile);

//print_r($xml);

$sensors = new SimpleXMLElement($xml);
echo $sensors->multisensor->device;
?>
131381
Lösung 131381 14.11.2016 aktualisiert um 16:30:36 Uhr
Goto Top
Du hast das Prinzip von SimpleXML wohl noch nicht verstanden, hier wird mit Objekten hantiert nicht mit Strings:
$xml = simplexml_load_file("daten.xml");  
$sensors = $xml->xpath('/alarmmanager/sensors/multisensor');  
$table = '<table border="1"><tr><th>Device</th><th>Temperatur</th><th>humidity</th></tr>';  
foreach($sensors as $sensor){
	$table .= '<tr><td>'.$sensor->device.'</td><td>'. $sensor->values->temperature . '</td><td>' . $sensor->values->humidity.'</td></tr>';  
}
$table .= '</table>';  
echo $table;

Ausgabe:

screenshot

Für das Beispiel wurden nur 3 Spalten übernommen, den Rest solltest du mit dieser Steilvorlage jetzt selbst schaffen.

Gruß
Akrosh
Akrosh 15.11.2016 um 07:44:37 Uhr
Goto Top
Du hast recht, ich verstehe das Prizip noch nicht so recht.
Dank deiner funktionierenden Vorlage kann ich mir das aber mal zur Brust nehmen.
Am eigenen Beispiel erkennt man das besser.

Vielen Dank für deine Hilfe, auch wenn ich mich SEHR SEHR schwer getan habe!
131381
131381 15.11.2016 um 09:48:45 Uhr
Goto Top
Dann bitte gelöst nicht vergessen.

Gruß