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-Key: 346549

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

Printed on: April 19, 2024 at 09:04 o'clock

Mitglied: 133883
Solution 133883 Aug 17, 2017 updated at 07:59:08 (UTC)
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ß
Member: tefracky
tefracky Aug 17, 2017 at 08:00:52 (UTC)
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>
Mitglied: 133883
133883 Aug 17, 2017 at 08:05:30 (UTC)
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.
Member: tefracky
tefracky Aug 17, 2017 at 08:39:10 (UTC)
Goto Top
Vielen Dank, ich habe es zum Laufen bekommen.
Mitglied: 133883
133883 Aug 17, 2017 at 08:42:55 (UTC)
Goto Top
Freut mich zu hören.
Member: tefracky
tefracky Aug 20, 2017 updated at 19:50:02 (UTC)
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)
Mitglied: 133883
133883 Aug 21, 2017 updated at 07:04:57 (UTC)
Goto Top
Das Gleichheitszeichen ist kein Vergleichsoperator!!
Hier benutzt du -eq.

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

Gruß