Replace xml values

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von research3, 29.11.2008.

  1. #1 research3, 29.11.2008
    Zuletzt bearbeitet: 29.11.2008
    research3

    research3 Grünschnabel

    Dabei seit:
    29.11.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo Zusammen,

    Ich versuche seit Stunden ein Bash Script zu erstellen aber leider ohne Erfolg.
    Der Script soll verschiedenen Variablen in einem Textdatei mit die richtige XML-Werte ersetzen. .

    Das XML File sieht folgend aus:

    file.xml

    ===================================
    <?xml version="1.0" encoding="UTF-8"?>
    <Daten>
    <export_date>2008-07-15 16:29:01</export_date>
    <language>english</language>
    ===================================

    temp.txt

    ===================================
    Alle Daten wurden am <export_date> Exportiert
    Die <language> übersetzung folgt.
    ===================================

    script.sh

    ===================================
    #!/bin/bash

    IFS=$'\n'

    for i in `cat file.xml | sed 's/>/ /g' | awk '{print $1}' | sed 's/</ /g' | sed 's/ //g'`
    do


    for j in `grep "$i" temp.txt | sed 's/.*<//g'| sed 's/>.*//g' `
    do
    #echo $j
    for h in `cat temp.txt | sed -e "s/"$j"/$(cat file.xml | grep "$j" | sed 's/>/ /g' | sed 's/</ /g' | awk '{print $2}')/g" >> temp2 `
    do
    echo $h
    done
    done


    done
    ==================================================

    Habt Ihr ein Idee was ich hier falsch mache ?

    thx
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Das Wunschergebnis:

    Alle Daten wurden am 2008-07-15 16:29:01 Exportiert
    Die language übersetzung folgt.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 slackfan, 29.11.2008
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Hallo,

    noch als Anmerkung:
    Für genau solche Dinge bietet sich in meinen Augen xsl wesentlicher besser an.

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>
    
    	<xsl:template match="/">
    		<xsl:apply-templates/>
    	</xsl:template>
    
    	<xsl:template match="//export_date">
    		<xsl:text>Alle Daten wurden am </xsl:text>
    		<xsl:value-of select="."/>
    		<xsl:text>Exportiert</xsl:text>
    	</xsl:template>
    	
    	<xsl:template match="//language">
    		<xsl:text>Die </xsl:text>
    		<xsl:value-of select="."/>
    		<xsl:text> Übersetzung folgt.</xsl:text>
    	</xsl:template>
    
    </xsl:stylesheet>
    
    cu
     
  4. #3 research3, 29.11.2008
    research3

    research3 Grünschnabel

    Dabei seit:
    29.11.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Danke für den Tipp, aber ich würde doch gerne Shell benutzen.
     
  5. #4 slackfan, 29.11.2008
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Das ist ja auch dein gutes Recht :)


    Aber das Argument ist seltsam: ob du jetzt sed und awk oder xsltproc nimmst, ist ja egal. Und den Stylesheet kann man auch per <<<EOF in ein Script einbinden.

    Wenn dein xml stets nur von einer Implementierung stammt, die Zeilenumbrüche einbaut, funktioniert das ja auch prima bei deiner Lösung. Wenn das aber nicht vorrausgesetzt werden kann - der Zeilenumbruch oder Tabs sind ja keine Bedingung in xml und manuelle Nacharbeit ist auch ein Thema - ist die Stylesheet-Lösung die bessere.


    cu
     
  6. #5 research3, 29.11.2008
    research3

    research3 Grünschnabel

    Dabei seit:
    29.11.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Sorry, kannst bitte du ein praktisches Beispiel posten.
    Du hast mein Interesse doch wachgerüttelt.
    Leider habe ich noch keine XSL oder XML Erfahrung und mein Ziel war, die Values einfach zu ersetzen. Dadurch, dass ich mich ein wenig mit Bash auskenne, wollte ich es damit versuchen.
     
  7. #6 slackfan, 30.11.2008
    Zuletzt bearbeitet: 30.11.2008
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Bitte sehr,

    aber wie gesagt: Wenn dir deine Lösung reicht, ist das in Ordnung, ich wollte nur darauf hinweisen. Je nachdem wie dein XML ausschaut, müsste der Stylesheet entsprechend angepasst werden.

    Da du keine DTD oder ein XML Schema gepostet hast, bin ich mal von einem einfachen Fall ausgegangen. Um XSLT zu erlernen sind besonders http://www.w3schools.com/XSL/ sowie http://de.selfhtml.org/xml/darstellung/index.htm praktisch.
    Letzteres ist auch eine nützliche und lesbare Referenz. Sehr nett, solange man nicht auf XSL 2.0 und Xpath 2.0 angewiesen ist.

    Für das Verständnis reicht das Shellscript. Alles davor dient nur der Vollständigkeit.

    XML-Datei posting.xml:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE Daten SYSTEM "posting.dtd">
    <Daten>
    <export_date>2008-07-15 16:29:01</export_date>
    <language>english</language>
    <weitere>das ist ein</weitere>
    <elemente>bisschen text</elemente>
    </Daten>
    
    DT-Definition posting.dtd:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Eine Vermischung von Groß- und Kleinschreibung 
    kann problematisch sein -->
    <!ELEMENT Daten (export_date, language, weitere, elemente)+>
    <!ELEMENT export_date (#PCDATA)>
    <!ELEMENT language (#PCDATA)>
    <!ELEMENT weitere (#PCDATA)>
    <!ELEMENT elemente (#PCDATA)>
    
    XSL-Stylesheet posting.xsl:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>
    
    <xsl:template match="/">
    	<xsl:call-template name="export"/>
    </xsl:template>
    
    <xsl:template name="export">
    	<xsl:for-each select="//export_date">
    		<xsl:text>Alle Daten wurden am </xsl:text>
    		<xsl:value-of select="."/> 
    		<xsl:text> exportiert.</xsl:text>
    		<xsl:text>& #10;</xsl:text>
    		<xsl:text>Die </xsl:text>
    		<xsl:value-of select="following-sibling::language"/>
    		<xsl:text> Übersetzung folgt.</xsl:text>
    		<xsl:text>& #10;</xsl:text>
    	</xsl:for-each>
    </xsl:template>
    
    </xsl:stylesheet>
    
    Shellscript posting.sh:
    Code:
    #!/bin/bash
    # slackfan@unixboard
    #
    # Benutzung:
    # posting.sh eingabedatei.xml [ausgabedatei.txt] [stylesheet.xsl]
    #
    
    cd $(dirname $0)
    
    #-------------------------------------------------------------------------------
    # Bereite Daten vor
    #-------------------------------------------------------------------------------
    
    # Setze Eingabe
    #-----------------
    if [ $1 ]; then
      eingabe="$1"
    else
      echo "Fehler: Bitte Eingabedatei angeben"
      exit 1
    fi
    
    # Setze Ausgabe
    #--------------
    if [ $2 ]; then
      ausgabe="-o $2"
    else
      ausgabe=""
    fi
    
    # Setze Stylesheet
    #-----------------
    if [ $3 ]; then
      stylesheet="$3"
    else
      tmpstylesheet=true
      stylesheet=$(tempfile)
      cat >> $stylesheet << EOF
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>
    
    <xsl:template match="/">
    	<xsl:call-template name="exportdate"/>
    </xsl:template>
    
    <xsl:template name="exportdate">
    	<xsl:for-each select="//export_date">
    		<xsl:text>Alle Daten wurden am </xsl:text>
    		<xsl:value-of select="."/> 
    		<xsl:text> exportiert.</xsl:text>
    		<xsl:text>& #10;</xsl:text>
    		<xsl:text>Die </xsl:text>
    		<xsl:value-of select="following-sibling::language"/>
    		<xsl:text> Übersetzung folgt.</xsl:text>
    		<xsl:text>& #10;</xsl:text>
    	</xsl:for-each>
    </xsl:template>
    
    </xsl:stylesheet>
    EOF
    fi
    
    #-------------------------------------------------------------------------------
    # Verarbeite Daten
    #-------------------------------------------------------------------------------
    
    xsltproc $ausgabe $stylesheet $eingabe
    
    #-------------------------------------------------------------------------------
    # Bereinige Daten
    #-------------------------------------------------------------------------------
    
    if [ $tmpstylesheet ]; then
      rm $stylesheet
    fi
    
    exit 0
    

    Ausgabe:
    Code:
    Alle Daten wurden am 2008-07-15 16:29:01 exportiert.
    Die english Übersetzung folgt.
    
    cu
     
  8. #7 research3, 30.11.2008
    research3

    research3 Grünschnabel

    Dabei seit:
    29.11.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Danke,

    setzt aber vorraus das ich einen xsl config habe sowie das ich den Shell Script entsprechend anpasse. Das Bedeutet wenn Änderungen anstehen muss ich manuell die Zeilen anpassen?
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. #8 slackfan, 01.12.2008
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Das ist richtig. Aber wie ich bereits anmerkte ist das eher die professionelle Lösung mit fest stehendem XML Schema oder DTD, welche vom Management abgesegnet ist ;)
     
  11. #9 research3, 01.12.2008
    research3

    research3 Grünschnabel

    Dabei seit:
    29.11.2008
    Beiträge:
    5
    Zustimmungen:
    0
Thema:

Replace xml values

Die Seite wird geladen...

Replace xml values - Ähnliche Themen

  1. str_replace

    str_replace: hi Ich will folgende Zeichenfolge in PHP umsetzen aber es funktioniert nicht. Ich denke ich muss da noch einiges Escapen aber was?...
  2. replace script von Sonderzeichen

    replace script von Sonderzeichen: Hallo alle, ich möchte in einigen Verzeichnissen auf einem Server Umlaute in allen Dateien ersetzen. Das habe ich mir mit einem Shell Script...
  3. str_replace()

    str_replace(): Nabend, ich hab mich mal mit str_replacer beschäftig. Hier mein Code: $bad=array("(",")","/","=","$","{","}","[","]",""); $replace="Hallo, du...
  4. Problem mit str_replace

    Problem mit str_replace: Servus Zusammen, ich habe ein Problem mit der Funktion str_replace unter PHP Version 5.2.0 zusammen in der Verwendung in einer Klasse. (Wenn ich...
  5. Text Search&Replace Files/Subdirectories

    Text Search&Replace Files/Subdirectories: Hallo zusammen, Ich möchte einen simplen Search&Replace über knapp 50.000 .html Dateien in verschiedenen Unterverzeichnissen ausführen, dabei...