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

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

Mitglied: 114757
114757 Sep 23, 2015 updated at 14:53:35 (UTC)
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
Member: Dnis822
Dnis822 Sep 23, 2015 updated at 14:57:57 (UTC)
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 Sep 23, 2015 updated at 15:08:57 (UTC)
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 ...
Member: Dnis822
Dnis822 Sep 23, 2015 at 15:15:46 (UTC)
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ß
Member: Dnis822
Dnis822 Sep 23, 2015 updated at 15:33:04 (UTC)
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 Sep 23, 2015 updated at 16:06:54 (UTC)
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
Member: Dnis822
Dnis822 Sep 24, 2015 at 06:59:22 (UTC)
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 Sep 24, 2015 updated at 07:07:45 (UTC)
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
Member: Dnis822
Dnis822 Sep 24, 2015 at 07:33:04 (UTC)
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?
Member: Dnis822
Dnis822 Sep 24, 2015 updated at 07:34:21 (UTC)
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 Sep 24, 2015 updated at 07:53:42 (UTC)
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.
Member: Dnis822
Dnis822 Sep 24, 2015 at 12:23:02 (UTC)
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
Solution 114757 Sep 24, 2015 updated at 13:52:25 (UTC)
Goto Top
EInfach einen Tab in die Liste der delimiter einfügen:
for /f "tokens=2 delims=^>^<	"