dnis822
Goto Top

Bestimmten Teil eines String aus einer XML-Datei auslesen

Hallo zusammen,

ich stehe vor folgendem Problem:

Ich habe eine XML-Datei die bspw. so aussieht:

...
<Url1>http://test:8080/Name/Version/...</Url1>
<Directory>C:\MeinVerzeichnis\test\..</Directory>
...

'Name' und 'Mein Verzeichnis' sind dabei variabel und können jedesmal unterschiedlich sein.
Das bedeutet ich muss den String ab"test:8080/" bis "/Version" auslesen.

Das bekomme ich leider nicht hin.

Gibt es die Möglichkeit das mit einem Batch-Script hinzubekommen?
Für Lösungsvorschläge wäre ich sehr dankbar.

Gruß

Content-Key: 283702

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

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: 114757
114757 23.09.2015 aktualisiert um 16:53:35 Uhr
Goto Top
Moin,
kein Problem mit einem "Hauch" Powershell in der Batch:
@echo off
set "file=C:\datei.xml"  
powershell -ExecutionPolicy ByPass -Command "([xml](gc '%file%')).GetElementsByTagName('Url1').InnerText.split('/')[3]"  
Oder noch kürzer mit sed:
sed -nr 's/.*8080\/([^\/]*).*/\1/p' Datei.xml  
Gruß jodel32
Mitglied: Dnis822
Dnis822 23.09.2015 aktualisiert um 16:57:57 Uhr
Goto Top
Vielen Dank schoneinmal!

Gibt es auch eine Möglichkeit ohne Powershell zu nutzen oder ohne sonstige Erweiterungen?

Habe ein etwas größeres Batch-Script und würde dieses gerne behalten und erweitern.
Mitglied: 114757
114757 23.09.2015 aktualisiert um 17:08:57 Uhr
Goto Top
Habe ein etwas größeres Batch-Script und würde dieses gerne behalten und erweitern.
Kannst du ja auch das da oben ist ja eine Batch ... naja hier noch eine mögliche pure Batch Old-School Variante:
@echo off
for /f "tokens=3 delims=/" %%a in ('findstr /ic:"test:8080" "C:\demo.xml"') DO @echo %%a  
Das geht aber nur wenn das keine UTF-8 Datei oder sonstiger exotischer Kram ist ...
Mitglied: Dnis822
Dnis822 23.09.2015 um 17:15:46 Uhr
Goto Top
Vielen Dank!

Die Datei ist UTF-8 kodiert.
Ist das ein Problem?

Und eine Frage zu der Lösung:
tokens=3 delims=/ sagt dem Script das der Wert nach dem dritten / genommen werden soll, versteh ich das richtig?
Wofür steht dann das ic:test:8080 und woher weiß das Script das es beim nächsten / wieder aufhört?

Gruß
Mitglied: Dnis822
Dnis822 23.09.2015 aktualisiert um 17:33:04 Uhr
Goto Top
Okay das mit dem ic habe ich verstanden, das Script sucht eine Zeile in dem der String vorkommt.
Ansonsten scheint das auch zu funktionieren.

Wenn allerdings bei diesem Beispiel:

<Url1>http://test:8080/Name/Version/...</Url1>"

der Name ebenfalls einen / enhält -> http://test:8080/Das/ist/der/Name/Version/...

kann ich nicht mehr anhand der / trennen sondern möchte ab dem "/test:8080/" bis "/Version" trennen.
ist das auch möglich?

Sonst habe ich erstmal kein Problem mit der UTF-8 kodierung gefunden
Mitglied: 114757
114757 23.09.2015 aktualisiert um 18:06:54 Uhr
Goto Top
kann ich nicht mehr anhand der / trennen sondern möchte ab dem "/test:8080/" bis "/Version" trennen.
ist das auch möglich?
@echo off & setlocal enabledelayedexpansion
for /f "tokens=2 delims=^>^<" %%a in ('findstr /ic:"test:8080" "C:\demo.xml"') DO @(  
	set "name=%%a"  
	set "name=!name:http://test:8080/=!"  
	set "name=!name:/Version/=|!"  
	for /f "tokens=1 delims=|" %%b in ("!name!") DO @echo %%b  
)

Sons' noch nen Wunsch ?

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen.

Gruß jodel32
Mitglied: Dnis822
Dnis822 24.09.2015 um 08:59:22 Uhr
Goto Top
Vielen Dank für Deine Mühe!

Das funktioniert leider nicht ganz bei mir.
Als Ausgabe erhalte ich !name!.

Könntest du mir den Code-Schnipsel etwas erläutern?
Mitglied: 114757
114757 24.09.2015 aktualisiert um 09:07:45 Uhr
Goto Top
Zitat von @Dnis822:

Vielen Dank für Deine Mühe!

Das funktioniert leider nicht ganz bei mir.
Als Ausgabe erhalte ich !name!.
Dann hast du vergessen "delayed expansion" zu aktivieren und meine erste Zeile nicht richtig übernommen !
@echo off & setlocal enabledelayedexpansion 
Siehe dazu:http://ss64.com/nt/delayedexpansion.html

Und zur Variablen-Stringersetzung in Zeile 4 und 5 siehe:
http://www.dostips.com/DtTipsStringManipulation.php
Mitglied: Dnis822
Dnis822 24.09.2015 um 09:33:04 Uhr
Goto Top
Super!
Das hat geholfen, danke!

Eine letzte Frage hätte ich noch.

Es funktioniert so:

<config>
<Url1>http://test:8080/Name/Version/...</Url1>
</config>

Aber nicht so:

<config>
<Url1>http://test:8080/Name/Version/...</Url1>
</config>

Das kann ich mir nicht erklären, wieso stören die Leerzeichen hierbei?
Mitglied: Dnis822
Dnis822 24.09.2015 aktualisiert um 09:34:21 Uhr
Goto Top
Oh ich sehe gerade, die Leerzeichen werden hier nicht mit angezeigt,
nun muss man sich einmal einen Tab vor der 2.ten <Url1> vorstellen face-smile

Gruß
Mitglied: 114757
114757 24.09.2015 aktualisiert um 09:53:42 Uhr
Goto Top
Zitat von @Dnis822:
Das kann ich mir nicht erklären, wieso stören die Leerzeichen hierbei?
Weil du diese dann ebenfalls in der ersten Schleife als Delimiter deklarieren musst. Ich sag ja, absolut wasserdicht bekommst du das nur mit Powershell / sed und Regular Expressions wie oben beschrieben hin ... Ihr Batchler bekommt hier halt die Quittung das ihr euch nicht weiterbildet ;-P und an der Krüppelsprache Batch hängen bleibt.
Mitglied: Dnis822
Dnis822 24.09.2015 um 14:23:02 Uhr
Goto Top
Wie deklariere ich das richtig im Delimiter?
Finde da leider keine Beispiele zu und alle meine Versuche enden leider in einer Syntax Verletzung.

Vielen Dank aufjedenfall, im Prinzip tut es genau das was ich will nur die Formatierung der XML würde ich gerne behalten.

Gruß
Mitglied: 114757
Lösung 114757 24.09.2015 aktualisiert um 15:52:25 Uhr
Goto Top
EInfach einen Tab in die Liste der delimiter einfügen:
for /f "tokens=2 delims=^>^<	"