Wert in xml suche und Einträge anzeigen

rernanded

Erfahrenes Mitglied
Moin,
habe ein Problem mit xml.
Hier die xml-Struktur samt 2 Test-Einträgen:
HTML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<form>
  <submit>
    <timestamp>2024-03-05 18:13:02</timestamp>
    <gender>männlich</gender>
    <name>peter</name>
    <email>info@bla.de</email>
    <message>per se kein anschluß unter dieser nummer</message>
  </submit>
  <submit>
    <timestamp>2024-03-05 20:44:19</timestamp>
    <gender>weiblich</gender>
    <name>polly</name>
    <email>mail@bluber.net</email>
    <message>holi di und holi da</message>
  </submit>
</form>

Hier das php:
PHP:
$loadxml = simplexml_load_file("form.xml") or die("Error: cannot create object");
$xml = new SimpleXMLElement($loadxml);
foreach ($xml->submit as $submit) {
//if ((string) $submit->gender === 'weiblich') {
    if (str_contains((string) $submit->gender, 'w')) {               
    echo "$submit->timestamp<br />"; 
    echo "$submit->gender<br />";
    echo "$submit->name<br />";
    echo "$submit->email<br />";
    echo "$submit->message<br />";
echo "<hr></hr>";
    }
}

Tja, bisher wird nichts ausgegeben. Liegt's an der 1. Zeile?
MONI
 
Tipp:

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Ohne genau zu wissen wie der SimpleXml funktioniert (ist zu lange her). Hast du nicht den Tag <form> vergessen?
 
@bdt600 Als ob ich das nicht machen würde. Ich habe allerdings bereits so viele Varianten geprüft mit unterschiedlichsten Fehlermeldungen, dass ich die hier nicht posten kann und will.
Ersetze die ersten beiden Zeilen durch

$dom = new DOMDocument();
$dom->load('form.xml');
$xml = new SimpleXMLElement($dom);

und Du bekommst promt eine andere Meldung.
Ich bin nicht so firm in xml (siehe yaslaw) und wende mich ans Forum. Ich habe Dir schon mal geraten auf meine Posts nicht mehr zu reagieren, ignoriere mich einfach als gäbe es mich nicht.

Debug-Tipps per copy and paste hier zu präsentieren hilft mir nicht. Ich bin nicht blöd und nicht faul.

Geht das in deinen Kopf?


@Yaslaw Ich schätze daran liegt es nicht. Andere Scripts funktionieren auch einwandfrei ohne <form> zu benutzen. Aber ich bin nicht wirklich firm in xml.


MONI
 
Als ob ich das nicht machen würde.
Machst du eben nicht, denn wo gibst du $submit->gender aus? Denn das kann ja nicht die fragliche Stelle sein. Und $xml könnte man auch mal ausgeben, davon sehe ich auch nichts.
Debug-Tipps per copy and paste hier zu präsentieren hilft mir nicht.
Wenn man sie nicht umsetzt, stimmt das-
Geht das in deinen Kopf?
Ich würde eher sagen, es geht nicht in deinen Kopf, wie man "Richtig debuggen" anwendet.
 
Das Problem besteht darin, dass Du das XML zwei Mal parst: simplexml_load_file liefert bereits ein Objekt und deshalb schlägt das folgende new SimpleXMLElement fehl weil es einen XML-String erwartet, nicht ein Objekt.
Außerdem musst Du auf das Charset achten: In deinem XML ist ISO-8859-1 angegeben, deshalb muss die Datei auch mit ISO-8859-1 gespeichert werden.
 
@Sempervivum
Habe jetzt folgende funktionierende Lösung, nur wie kann ich nach Teilwerten suchen, zB in <email></email>
nach "bluber" anstatt nach "mail@bluber.net"? MONI

PHP:
<form action="search.php" method="post">
<input type="text" name="search">
<input type="submit" value="los">
</form>

<?php
$search = $_POST['search'];

echo "SUCHWERT = ".$search."<br /><br /><br />";

    $xml = simplexml_load_file('form.xml');

//$submit = $xml->xpath("/form/submit[gender='$search']");
//alternativ:
$submit = $xml->xpath(sprintf('/form/submit[gender="%s"]', $search));

    foreach($submit as $submit) {
    echo $submit->timestamp."<br />";
    echo $submit->gender."<br />";
    echo $submit->name."<br />";
    echo $submit->email."<br />";
    echo $submit->message."<br />";
    }

    echo "<br /><hr></hr>";

?>
 

Neue Beiträge

Zurück