Antworten auf deine Fragen:
Neues Thema erstellen

PHP5 sortieren von xml nach Attribut

pain2000

Nicht mehr ganz neu hier

Hallo zusammen,
nach langer Abstinenz mal wieder eine Frage.
Also, ich habe eine xml-Datei mit folgendem Aufbau:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<eintr>
  <eintrag name="Test1" str="Teststr. 1" plz="12345 Testort" nr="467"/>
  <eintrag name="Test3" str="Teststr. 3" plz="12345 Testort" nr="405"/>
</eintr>
Nun hab ich ein Formular geschrieben, in dem ich die vorhandenen Einträge ändern und löschen kann und neue Einträge hinzufügen kann. Das klappt soweit.

Nun meine Frage: Füge ich jetzt z.B. einen Eintrag mit dem Namen "Test2" ein, wird dieser am Ende unter "Test3" eingefügt. Wie kann ich den xml-Output nun nach dem Attribut 'name' sortieren lassen bevor ich ihn in die Datei zurück schreibe?

So sieht etwa mein Code aus:
PHP:
$dat = "test.xml";
$xml  = simplexml_load_file($dat);
if(@$_POST["typ"] == "neu" && strlen(@$_POST["n_nr"]) > 0) {
 // section erstellen und wert zuweisen
 $section = $xml->addChild("eintrag");
 $section->addAttribute("name", utf8_encode(@$_POST["n_name"]));
 $section->addAttribute("str", utf8_encode(@$_POST["n_str"]));
 $section->addAttribute("plz", utf8_encode(@$_POST["n_plz"]));
 $section->addAttribute("nr", utf8_encode(@$_POST["n_nr"]));
 speichern($xml,$dat);
 $xml = simplexml_load_file($dat);
}

function speichern($inhalt,$datei) {
 $doc = new DOMDocument('1.0', 'UTF-8');
 $doc->preserveWhiteSpace = false;
 $doc->loadXML($inhalt->asXML());
 $doc->formatOutput = true;
 file_put_contents($datei,$doc->saveXML());
}
Hat jemand evtl eine Ahnung, wie ich das realisieren kann?
 

pain2000

Nicht mehr ganz neu hier

AW: PHP5 sortieren von xml nach Attribut

@TheDon0Ne: das verstehe ich irgendwie nicht. Welchen Code?

Also ich hab das folgende ausprobiert:
PHP:
function speichern($inhalt,$datei) {
 $doc = new DOMDocument('1.0', 'UTF-8');
 $doc->preserveWhiteSpace = false;
 $doc->loadXML($inhalt->asXML());
 $doc->formatOutput = true;
 $root = $doc->documentElement;
 $sort = $root->getElementsByTagName('eintrag');
 usort($sort, "sortieren");
 foreach ($sort as $neu) { $root->appendChild($neu); }  
 echo $doc->saveXML(); exit;
 //file_put_contents($datei,$doc->saveXML());
}
function sortieren($a, $b) {
 return strnatcmp($a->getAttributeNode('name')->value, $b->getAttributeNode('name')->value);
}
Jedoch ist die Ausgabe nun total konfus durcheinander... stehe irgendwie auf dem Schlauch...
 

Thyras

Nicht mehr ganz neu hier

AW: PHP5 sortieren von xml nach Attribut

PHP:
$xml = simplexml_load_file('test.xml');

function sortXml($a, $b) {
    return strnatcmp($a['name'], $b['name']);
}

function createSortedXml($input, $output, $rootNode = 'eintr') {
    $doc = new DOMDocument('1.0', 'UTF-8');
    $doc->preserveWhiteSpace = false;
    $root = $doc->createElement($rootNode);
    $doc->appendChild($root);
    
    foreach($input as $item) {
        $item = dom_import_simplexml($item);
        $node = $doc->importNode($item, true);
        $root->appendChild($node);
    }
    
    $doc->formatOutput = true;
    file_put_contents($output, $doc->saveXML());
}

$input = $xml->xpath("/eintr/eintrag");
usort($input, "sortXml");
createSortedXml($input, 'test2.xml');
Evtl. geht's noch einfacher, aber so funktioniert es denk ich.

PS: Rechnung kommt mit der Post! :D:D

[edit]
Allerdings geh' ich hier davon aus, dass eine unsortierte XML-Datei existiert und diese in eine sortierte gewandelt wird. Wenn du während der Erfassung schon prüfen willst, musst du selber nochmal ran. ;)
 
Zuletzt bearbeitet:

pain2000

Nicht mehr ganz neu hier

AW: PHP5 sortieren von xml nach Attribut

@Thyras: Supi. Haut hin... Vielmals merci.
Doch ein kleines Problem hab ich noch mit dem Sortieren. Ich habe z.B. die Namen 'Baader' und 'Böhm'. Nach der Sortierung steht der Name 'Böhm' jedoch vor 'Baader'. Wie kommt denn das? Hat das was mit dem UTF-8 und Umlauten zu tun?
Wäre kuhl, wenn da jemand mal 'nen Tip hätte...
 

Thyras

Nicht mehr ganz neu hier

AW: PHP5 sortieren von xml nach Attribut

Versuch's mal mit str_replace()... bei der Sortierfunktion und ersetze die Umlaute temporär mit ae, oe, etc.
 
Zuletzt bearbeitet:

pain2000

Nicht mehr ganz neu hier

AW: PHP5 sortieren von xml nach Attribut

Versuch's mal mit str_replace()... bei der Sortierfunktion und ersetze die Umlaute temporär mit ae, oe, etc.
Hi,
ich hab es jetzt mal so probiert:
PHP:
function sortieren($a, $b) {
 $uml_deu = array("ä","ö","ü","ß");
 $uml_int = array("ae","oe","ue","ss");
 for($x=0;$x<4;$x++){
  $a["name"] = str_replace($uml_deu[$x],$uml_int[$x],$a["name"]);
  $b["name"] = str_replace($uml_deu[$x],$uml_int[$x],$b["name"]);
 }
 return strnatcasecmp($a["name"],$b["name"]);
}
jedoch bleibt das Ergebnis so... Was mache ich da falsch??
 

pain2000

Nicht mehr ganz neu hier

AW: PHP5 sortieren von xml nach Attribut

Sooo, hab noch a biserl rumprobiert und siehe da:
PHP:
function sortieren($a, $b) {
 $c = utf8_decode($a["name"]); $d = utf8_decode($b["name"]);
 $uml_deu = array("ä","ö","ü","ß");
 $uml_int = array("ae","oe","ue","ss");
 for($x=0;$x<4;$x++){
  $c = str_replace($uml_deu[$x],$uml_int[$x],$c);
  $d = str_replace($uml_deu[$x],$uml_int[$x],$d);
 }
 return strnatcasecmp($c,$d);
}
Es geht... Oh mann, da hätte ich auch gleich drauf kommen können, dass das mit UTF-8 zusammen hängt.
Und somit bleiben auch die Umlaute erhalten ;)
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.616
Beiträge
1.538.358
Mitglieder
67.536
Neuestes Mitglied
QuestionMark
Oben