XML Datei sortieren? Programm oder andere Möglichkeit?

cuco

Moderator
Teammitglied
Themenstarter
Registriert
1 Dez. 2011
Beiträge
7.726
Ich habe hier eine XML-Datei erstellt, die ich gerne sortieren würde. Genau genommen sind es APN-Konfigurationen für Android, aber ist ja nicht direkt wichtig.
Alle Einträge in der Datei haben folgendes Format:

Code:
<apn carrier="Ein_Name1" mcc="001" mnc="01" [noch ein paar für die Sortierung unwichtige Daten] />
<apn carrier="Ein_Name2" mcc="002" mnc="01" [noch ein paar für die Sortierung unwichtige Daten] />
<apn carrier="Ein_Name3" mcc="002" mnc="02" [noch ein paar für die Sortierung unwichtige Daten] />

Ich würde die Liste nun gerne sortieren. Und zwar abaufsteigend soll erst nach MCC sortiert werden. Ist die MCC gleich, soll nach MNC sortiert werden. Ist die MNC auch gleich, soll nach Carrier sortiert werden.

Gibt es da eine Möglichkeit/Software (Windows oder Linux) dafür?
Konnte die Datei mit Excel öffnen und dann auch sortieren - leider schneidet Excel dann aber führende Nullen bei MCC/MNC ab und ich kann die Datei am Ende nicht wieder zurück in eine XML speichern.

//EDIT: Aufsteigend, nicht absteigend. Von klein nach groß, von A nach Z. ^^
 
Zuletzt bearbeitet:
unter Linux bietet sich sort an, ich bin mir nicht sicher aber versuch mal mit dieser Befehlsfolge

sort -t'"' --key=2,3 liste.xml > temp_liste.xml
sort -t'"' --key=1 -r temp_liste.xml > sortierte_liste.xml

Edit: ich glaube das funktioniert nicht :facepalm: ich schau mal wie man die beiden befehle verknüpfen kann

sort -t "=" +2 -3 +3 -4 +0 -1 liste.xml

wobei die Spalten nach mnc höchstwahrscheinlich nicht ignoriert werden

sort -t '"' +3 -4 +5 -6 +1 -2 liste.xml

ich hoffe das letzte Befehl funktioniert :)
 
Zuletzt bearbeitet:
ich kenn das nur von OpenOffice (also kA obs in excel ähnlich funzt, vmtl ja)
da kann ich vorm reinkopieren/Import für jede spalte die Formatierung bestimmen,
und als [Text] bleiben die Führungsnullen natürlich so stehn.
Wenn die strings keine nutzbaren zeichen als texttrenner enthalten bringe ich die auch schon mal mit suchen&ersetzen rein.


Ich vermute Du kannst die Tabellenkalkulationsprogs auch irgendwo so einstellen
dass die Führungsnullen stehn bleiben wenn die Zellen als "Zahl" bzw "Standard" formatiert sind.

Falls nicht/kein bock zu suchen und die daten im excel/OOcalc weiter verarbeitet werden müssen
bietet sich als workaround immer noch export als txt + reimport an.
 
PHP + SimpleXML + ne hübsche For-Schleife drum ;)

XML in bash ist fuckup delüüüxe:

https://nerdstube.de/?p=295

Singleline-XML ist noch ganz okay .. aber Multiline geht gar nich ;)

Grüße
 
@blafoo
hast recht, sofern es über eine Zeile verteilt ist dann hat man sehr schlechte Karten mit sort
 
Ih, da blicke ich noch nicht so ganz durch... aber ich glaube, mit sort habe ich es doch gerade hinbekommen...
sort -t'"' --key=1,2 apns-conf.xml > temp_liste1.xml
sort -t'"' --key=3,6 temp_liste1.xml > temp_liste2.xml
Das Ergebnis sieht derzeit auf den ersten Blick so aus, wie ich es gerne hätte. Nochmal genauer drüber schauen, vielleicht passt das schon so! Und nach doppelten Einträgen suchen - aber das muss ich manuell, weil die teilweise auf Carrier, MCC und MNC gleich sind und sich erst danach unterscheiden, was dann allerdings für die weitere Verarbeitung wenig Sinn macht ^^
 
Achte drauf das das File sauber formatiert ist, wenn sort denkt das dort Umbrüche drin sind hast du den Salat.

Meine Empfehlung: Schau in meinen Link und machs per SED/AWK, wenn du es in bash machen willst! (So ungerne ich in PHP dinge mache, SimpleXML in PHP ist mit das schickeste XML-interface was ich je gesehen habe, php kannst du auch via bash ausfuehren mit php /pfad/tollesscript.php)

Das ganze in einem Bash-Array speichern, und dann mit einer for-Schleife (for i in blablabla) ausgeben.

Das ist, meiner Meinung nach, die sauberer Lösung.

In deinem Fall sollte folgendes von AWK bei dir matchen:

Code:
cat list.xml | awk 'BEGIN{RS="mcc="} NR>1 {print substr($0,1,index($0," "))}'

Das ganze durch eine For-Schleife jagen, ins Array packen, mit bubble-Sort auf Bash sortieren und dann wieder ausgeben lassen.

**EDIT**

Code:
echo "<apn carrier="Ein_Name1" mcc="001" mnc="01" [noch ein paar für die Sortierung unwichtige Daten] />" | awk 'BEGIN{RS="mcc="} NR>1 {print substr($0,1,index($0," "))}'

ergibt

Code:
001

Du lammst nun mit wc -l alle moeglichen zeilen zaehlen lassen der xml, und dann mit while, tail und head jede zeile einzelnd durchgehen und bei nem founded match das ins array packen

Das ganze kannst du dann zb, wenn der Wert in einem Array ist, nennen wir das Array $WERT, im Bubblesort anwenden.

Siehe hier:
http://www.bashguru.com/2010/07/bubble-sort-shell-script.html

Wenn du das Array sortiert hast, kannst du zb mit einer while -Schleife folgendes machen, um einen sicherern Wert zu haben kannst du ja mcc und mnc in ein Array schreiben und folgendes machen:

Code:
j=${#array[@]}
counter=0
i=0
while [ $counter -lt $j ]; do
  cat $xml.file | grep ${#wert[$i] | grep ${#wert2[$i] >> neues_file.xml
  let counter=counter+1
  let i=i+1
done



Das sollte es, ich bin müde und dezent unkonzentriert, eigentlich schon gewesen sein :)



Grüße
 
Zuletzt bearbeitet:
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben