x

Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht


  1. Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht · jman1983 (Gast) · 20.01.2013 10:32 · [flux]

    Guten Morgen alle zusammen,

    kennt sich hier zufällig jemand mit "xmlstarlet" aus?

    Ich möchte eine eigene Changefile erzeugen. In dieser sollen Nodes gelöscht werden, welche bereits einmal durch eine Prüfung gelaufen sind und beim nächsten Mal erst gar nicht wieder in die Prüfung kommen sollen.

    Dies wird anhand einer Liste bereits geprüfter Nodes erledigt und anschließend möchte ich mit xmlstarlet ein Changefile "bauen"

    Hier der Code dazu:

    for␣/f␣"usebackq"␣%%a␣in␣("idListe.txt")␣do␣(
    xmlstarlet␣ed␣-s␣/osmChange/delete␣-t␣elem␣-n␣node␣-v␣""␣-i␣/osmChange/delete/node␣-t␣attr␣-n␣id␣-v␣%%a␣<␣changefile.osc␣>␣changefile.osc
    )
    

    (Bitte nicht "mobben", ich weiß schon cmd-batch ist nicht das Beste 😉

    Die "idListe.txt" sieht z.B. so aus:

    123456
    789012
    345678

    Mein Problem ist nun, dass die changefile.osc immer wieder überschrieben wird und die einzelnen Nodes nicht hinzugefügt werden ;(

    Kann mir dort jemand weiterhelfen??

    Vielen Dank schonmal und noch einen schönen Sonntag!

    Gruß

    Jan



    • Re: Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht · wambacher (Gast) · 20.01.2013 13:38 · [flux]

      mmd wrote:

      Darf man mal fragen, wie genau dein Anwendungsfall aussieht?

      ich schätze mal, dass das in irgendeinen Batch - also ohne Gui - integriert werden soll.

      Sollte das der Fall sein, möchte ich euch auf dieses Dokument hinweisen, was unsere "Spielregeln" bezüglich automatischer Edits der Osm-Daten beschreibt.

      Gruss
      walter


    • Re: Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht · jman1983 (Gast) · 20.01.2013 13:57 · [flux]

      Hallo mmd, wambacher

      mmd wrote:

      for /f "usebackq" %%a in ("idListe.txt") do (
      xmlstarlet ed -s /osmChange/delete -t elem -n node -v "" -i /osmChange/delete/node -t attr -n id -v %%a < changefile.osc > changefile.osc2
      del changefile.osc
      ren changefile.osc2 changefile.osc
      )

      bringt leider auch nicht den gewünschten Erfolg ;(

      wambacher wrote:

      ich schätze mal, dass das in irgendeinen Batch - also ohne Gui - integriert werden soll.

      Sollte das der Fall sein, möchte ich euch auf dieses Dokument hinweisen, was unsere "Spielregeln" bezüglich automatischer Edits der Osm-Daten beschreibt.

      Genau, es ist für eine "private" Prüfroutine gedacht und soll dazu dienen nicht bei jedem Prüflauf jedes Element wieder und wieder zu prüfen...

      Und keine Angst, die Daten werden NICHT automatisch zurück in die Datenbank geschrieben sondern intern verwendet. Trotzdem danke für den Link!

      Hat sonst noch jemand zufällig eine Idee und/oder Lösung?
      Am Anfang war die DAtei noch ein "osmconvert parameterfile", allerdings ist es nun "zu groß" und daher hab ich mir diese Lösung ausgedacht.
      Also soll dieses Skript nur einmal laufen und die Datei in ein Changefile umwandeln, anschließend will ich es per "changefile merge" erledigen (zumindest stelle ich es mir so vor... 😉 )

      Nochmal vielen Dank für eure Hilfe


    • Re: Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht · wambacher (Gast) · 20.01.2013 14:25 · [flux]

      jman1983 wrote:

      Und keine Angst, die Daten werden NICHT automatisch zurück in die Datenbank geschrieben sondern intern verwendet.

      na gut, dann ist das schon mal geklärt. Nicht böse sein aber mer haben hier schon die tollsten Sachen erlebt.

      Hat sonst noch jemand zufällig eine Idee und/oder Lösung?
      Am Anfang war die DAtei noch ein "osmconvert parameterfile", allerdings ist es nun "zu groß" und daher hab ich mir diese Lösung ausgedacht.
      Also soll dieses Skript nur einmal laufen und die Datei in ein Changefile umwandeln, anschließend will ich es per "changefile merge" erledigen (zumindest stelle ich es mir so vor... 😉 )

      Ich würde solche Sachen mit osmosis erledigen.
      Es gibt zwar massenhaft Tools, die gewisse Teilaufgaben von Osmosis schneller und einfacher erledigen, aber spätestens wenn es um Change-Files geht, sollte man die "OSM-Datenschleuder" benutzen - genau wie unsere Kollegen auf den OSM-Servern in UK.
      Du kannst mit osmosis fast alles mit Osm-Daten machen - wenn du es kannst 😉
      Dazu gibt es noch OSMembrane als GUI, mit der du die Osmosis-Kommandos generieren kannst.

      Gruss
      walter

      um dir mal einen Eindruck zu geben: ein Batch zum Erstellen von osmand-Daten "meiner" Ecke.

      #!/bin/bash
      #
      cd␣~/osm/osmand
      
      wget␣http://download.geofabrik.de/openstreetmap/europe/germany/hessen.osm.pbf␣-O␣~/osm/osmand/pbf/hessen.osm.pbf
      wget␣http://download.geofabrik.de/openstreetmap/europe/germany/rheinland-pfalz.osm.pbf␣-O␣~/osm/osmand/pbf/rheinland-pfalz.osm.pbf
      
      /opt/install/osmosis-0.41/bin/osmosis␣␣\
      --read-pbf␣file=~/osm/osmand/pbf/hessen.osm.pbf␣\
      --read-pbf␣file=~/osm/osmand/pbf/rheinland-pfalz.osm.pbf␣␣␣\
      --log-progress␣interval=60␣label="merging"␣\
      --merge␣␣␣␣␣␣␣␣␣␣			␣␣␣\
      --bounding-polygon␣file=$1.poly␣\
      completeWays=false␣\
      completeRelations=false␣\
      clipIncompleteEntities=true␣\
      --write-xml␣file=~/osm/osmand/osm/$1.osm
      
      cd␣/opt/install/OsmAndMapCreator
      
      java␣␣␣-Djava.util.logging.config.file=logging.properties␣\
      -Xms256M␣-Xmx1280M␣\
      -cp␣"./OsmAndMapCreator.jar:./lib/OsmAnd-core.jar:./lib/*.jar"␣\
      net.osmand.data.index.IndexBatchCreator␣\
      batch.xml
      
      cd␣~/osm/osmand
      
      wput␣-v␣-nc␣-u␣-t␣3␣--waitretry=30␣\
      /home/walter/osm/osmand/idx/$1_2.obf␣\
      ftp://walter:xxx@andy:2121/mnt/extSdCard/osmand/$1_2.obf
      

      der mittlere Befehl erledigt: Merge zweier Rohdaten-Files, Ausschneiden eines Polygons, Ausgabe im OSM-Format - alles in einem Rutsch.

      p.s. wen's interessiert: meine Lösung hierzu


    • Re: Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht · mmd (Gast) · 20.01.2013 14:27 · [flux]

      - snip, siehe Edit in Post #2 -


    • Re: Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht · jman1983 (Gast) · 20.01.2013 14:50 · [flux]

      mmd wrote:

      Edit - %%a durch %%a% ersetzt. Problem besteht weiterhin, dass xmlstarlet die Daten an den ersten Knoten hinzufügt.
      Fehlermeldung:

      -:4.16: Attribute id redefined
      <node id="123456" id="789012"/>

      Ausgangsfile zum Testen:
      <?xml version="1.0"?>
      <osmChange version="0.6" generator="Osmosis">
      <delete /></osmChange>

      Genau das Problem hab ich auch! Allerdings bringt %%a -> %%a% bei mir auch nicht den gewünschten Effekt, es kommt die selbe Fehlermeldung!

      @wambacher:
      Keine Angst, ich bin nicht "böse"! Warum auch? Du hast ja nur darauf hingewiesen, konntest du ja nicht ahnen, dass es "für mich" ist 😉
      Ja über osmosis hab ich auch schonmal nachgedacht, evtl. werde ich meine Auswertung mal darauf umstellen, aber im Moment will ich erstmal dieses "olle" Changefile hinbekommen 😉 step by step ....

      OT: Interessant, es gibt auch "wput", muss ich im Hinterkopf behalten...


    • Re: Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht · Netzwolf (Gast) · 20.01.2013 15:34 · [flux]

      Nahmd,

      jman1983 wrote:

      [...]␣<␣changefile.osc␣>␣changefile.osc
      

      Gleichzeitiges Lesen aus und Schreiben in eine Datei ist nur selten eine gute Idee.
      Versuche es einmal mit (Pseudocode):

      COMMAND␣<changefile.osc␣>␣changefile.osc.NEU
      DELETE␣changefile.osc
      RENAME␣changefile.osc.NEU␣changefile.osc
      

      Je nach Betriebssystem/Einstellungen/Optionen erledigt das RENAME das DELETE gleich mit, dann braucht es das DELETE nicht.

      Gruß Wolf


    • Re: Per xmlstarlet eigene Changefile erstellen - XML Profi gesucht · jman1983 (Gast) · 20.01.2013 17:28 · [flux]

      Hallo Netzwolf,

      ja danke für deinen Hinweis. "mmd" hat ja schon einen entsprechenden Eintrag gepostet, der mit deinem identisch ist (nur kein Pseudocode). Leider war es ja nicht erfolgreich