tefracky
Goto Top

Per Batch Textstellen vertauschen

Hallo,

es geht um folgenden Dateiausschnitt aus einer Test.xml:

<competition start-date="2017-09-02 10:00" ttr-from="0" ttr-to="2000" age-group="Herren" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="A " age-to="1897" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-03 10:00" ttr-from="0" ttr-to="1800" age-group="Herren" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="B" age-to="1897" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>

Leider hat der Server, auf den ich keinen Zugriff habe, die Daten bei age-from und age-to vertauscht. Wie kann ich nun in der gesamten Datei diese Textstellen suchen und die entsprechenden Jahreszeilen vertauschen lassen?

Gruß

Tefracky

Content-ID: 346549

Url: https://administrator.de/contentid/346549

Ausgedruckt am: 05.12.2024 um 02:12 Uhr

133883
Lösung 133883 17.08.2017 aktualisiert um 09:59:08 Uhr
Goto Top
Batch ist für die Bearbeitung von XML-Dateien ungeeignet und das schlechteste Mittel der Wahl. Hier arbeitet man immer mit einem XML-Parser oder gleich mit XSLT!!
Also nimm bswp. Powershell für die Spielerei.

Leider postest du nur einen Ausschnitt aus der XML so dass mann nur vermuten kann ob das XML File Namespaces verwendet, was für das posten von passendem Code eigentlich notwendig wäre.
$file = 'C:\test.xml'  
$xml = new-object XML
$xml.Load($file)
$xml.SelectNodes('//competition') | %{  
    $from = $_.'age-from'  
    $to = $_.'age-to'  
    $_.'age-from' = $to  
    $_.'age-to' = $from  
}
$xml.Save($file)
Bei Verwendung von Namespaces die wir hier nicht sehen können sind Anpassungen nötig!

Gruß
tefracky
tefracky 17.08.2017 um 10:00:52 Uhr
Goto Top
Hallo,

Power Shell würde natürlich auch gehen, aber kann man das Skript dann auch genauso bequem ausführen wie eine Bat-Datei?

Im Prinzip würde es sogar schon reichen, wenn "age-to" auf "age-from" gesetzt wird und bei "age-to" immer 2017 steht.

Anbei noch die vollständige XML

Gruß


<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE tournament SYSTEM "http://liga.nu/dtd/TournamentPortal.dtd">  
<tournament end-date="2017-09-17" multiple-participations-same-day="true" winning-sets="3" multiple-participations-same-time="false" start-date="2017-09-16" name="Kreiseinzelmeisterschaften" table-count="16" tournament-id="2FEcoE9KFEcq7">  
	
		<tournament-location/> 
	
		<tournament-location city="..." zip-code="..." name="..." street="..."/>   
	
	
		<competition start-date="2017-09-17 13:30" age-group="Männliche Jugend" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="Stichtag 01.01.2000" age-to="2000" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-17 13:30" age-group="Männliche Jugend" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="Stichtag 01.01.2000" age-to="2000" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-17 13:30" age-group="Weibliche Jugend" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="weiblich" ttr-remarks="Stichtag 01.01.2000" age-to="2000" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-17 13:30" age-group="Weibliche Jugend" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="weiblich" ttr-remarks="Stichtag 01.01.2000" age-to="2000" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-16 09:30" age-group="Schüler A" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="Stichtag 01.01.2003" age-to="2003" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-16 09:30" age-group="Schüler A" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="Stichtag 01.01.2003" age-to="2003" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-16 09:30" age-group="Schülerinnen A" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="weiblich" ttr-remarks="Stichtag 01.01.2003" age-to="2003" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-16 09:30" age-group="Schülerinnen A" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="weiblich" ttr-remarks="Stichtag 01.01.2003" age-to="2003" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-17 09:30" age-group="Schüler B" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="Stichtag 01.01.2005" age-to="2005" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-17 09:30" age-group="Schüler B" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="Stichtag 01.01.2005" age-to="2005" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-17 09:30" age-group="Schülerinnen B" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="weiblich" ttr-remarks="Stichtag 01.01.2005" age-to="2005" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-17 09:30" age-group="Schülerinnen B" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="weiblich" ttr-remarks="Stichtag 01.01.2005" age-to="2005" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-16 13:30" age-group="Schüler C" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="Stichtag 01.01.2007" age-to="2007" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-16 13:30" age-group="Schüler C" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="gemischt" ttr-remarks="Stichtag 01.01.2007" age-to="2007" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-16 13:30" age-group="Schülerinnen C" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="weiblich" ttr-remarks="Stichtag 01.01.2007" age-to="2007" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  
			<players>
				
			</players>
		</competition>
	
		<competition start-date="2017-09-16 13:30" age-group="Schülerinnen C" final-round-playmode="Einfaches K.-o.-System" age-from="2017" max-persons="999" sex="weiblich" ttr-remarks="Stichtag 01.01.2007" age-to="2007" type="Doppel" entry-fee="0.0">  
			<players>
				
			</players>
		</competition>
	
</tournament>
133883
133883 17.08.2017 um 10:05:30 Uhr
Goto Top
Power Shell würde natürlich auch gehen, aber kann man das Skript dann auch genauso bequem ausführen wie eine Bat-Datei?
Ja, kann man auch eine EXE von machen.
tefracky
tefracky 17.08.2017 um 10:39:10 Uhr
Goto Top
Vielen Dank, ich habe es zum Laufen bekommen.
133883
133883 17.08.2017 um 10:42:55 Uhr
Goto Top
Freut mich zu hören.
tefracky
tefracky 20.08.2017 aktualisiert um 21:50:02 Uhr
Goto Top
Leider habe ich noch ein Problem, folgender Teil gibt ein gutes Beispiel:

<competition start-date="2017-09-03 14:00" age-group="Senioren 40" final-round-playmode="Einfaches K.-o.-System" age-from="1978" sex="gemischt" ttr-remarks="Stichtag 31.12.78 und älter" age-to="1897" type="Einzel" entry-fee="0.0" preliminary-round-playmode="Gruppen Jeder gegen jeden">  

Wenn bei age-group "Herren" oder "Senioren 40" oder "Senioren 50" oder "Senioren 60" etc. steht, müsste sex="gemischt" zu sex="Herren" geändert werden. Wie liese sich das anstellen?

Bei diesem Testcode wird leider alles zu "Herren" bzw. "männlich":

$file = 'C:\Users\***\Desktop\Turnierteilnehmer.xml'  
$xml = new-object XML
$xml.Load($file)
$xml.SelectNodes('//competition') | %{  
    $from = $_.'age-from'  
    $to = $_.'age-to'  
    $_.'age-from' = $to  
    $_.'age-to' = $from  
    if($_.'age-group' = 'Herren'){  
        $_.'sex' = 'männlich'  
    }
}
$xml.Save($file)
133883
133883 21.08.2017 aktualisiert um 09:04:57 Uhr
Goto Top
Das Gleichheitszeichen ist kein Vergleichsoperator!!
Hier benutzt du -eq.

https://www.windowspro.de/script/vergleichsoperatoren-powershell-eq-lt-g ...

Gruß