Replace xml values

R

research3

Grünschnabel
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.
 
Zuletzt bearbeitet:
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
 
Danke für den Tipp, aber ich würde doch gerne Shell benutzen.
 
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
 
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.
 
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
 
Zuletzt bearbeitet:
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?
 
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 ;)
 

Ähnliche Themen

Switche abfragen über Script

sed in awk

Verschlüsseltes Backup-Script mit rsync

Skript bei Lubuntu nach jedem Start ausführen

html2text für ganzes Verzeichnis

Zurück
Oben