pappkamerad
Goto Top

BATCH Element aus XML-File auslesen

Hallo liebe Admins,

ich habe schon öfter bei euch vorbeigeschaut und ein immer eine Lösung für meine Problemchen gefunden. Nun stehe ich aber vor einer Frage, die ich mit meinen Wissen und den Denkanstössen aus dem Netz und von hier leider nicht lösen kann.

Ich möchte aus einem XML-File ein Element (eine URL) auslesen. Diese steht an einer bestimmten Stelle, die sich eventuell ändert (kann ich noch nicht genau sagen).

Bei einem anderen Projekt konnte ich mit diesem Code

for /f "delims== tokens=2"  %%b in ('find "enclosure url=" %file%') do echo %%b>url.txt  

den Wert auslesen.

Aber beim jetzigen Projekt steht der gesamte Inhalt der XML in einer Zeile

<?xml version="1.0" encoding="utf-8" ?><images><image><startdate>20160517</startdate><fullstartdate>201605170000</fullstartdate><enddate>20160518</enddate><url>http://192.168.1.25/index.html</url><urlMain>http://192.168.1.25/main.html</urlMain><drk>1</drk><top>1</top><bot>1</bot><hotspots></hotspots><messages></messages></image><tooltips><loadMessage></loadMessage></tooltips></images>  

for /f "tokens=2 delims=<>" %%b in ('findstr "<urlMain>" en.xml') do echo %%b>url.txt  

liefert mit somit leider nicht die URL nach <urlMain> sondern den Text zwischen den 2. <>, also "images". Ich könnte natürlich abzählen und den Token-Wert erhöhen, aber wenn sich die Posistion von urlMain ändert, fällt das ganz auf die Nase. Wie kann ich den Teilstring zwischen <urlMain> und </urlMain> auslesen?

Für Tipps wäre ich sehr dankbar.

Gruß
pappkamerad

Content-ID: 304729

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

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

rubberman
rubberman 18.05.2016 um 01:08:54 Uhr
Goto Top
Hallo pappkamerad.

Dein Problem ist eines der Gründe, warum man XML nicht mit Batch verwurstet. Dafür gibt's das Document Object Model (DOM). Eine Batch-JScript Kombination würde sicher funktionieren.

*.bat
@if (@a)==(@b) @end /*

@echo off &setlocal

for /f "delims=" %%i in ( 
  ' cscript //nologo //e:jscript "%~fs0" "test.xml" "images/image/urlMain" ' 
) do echo %%i
pause

exit /b

*/
var oXmlDoc = new ActiveXObject('Microsoft.XMLDOM');  
oXmlDoc.async = false;
oXmlDoc.load(WScript.Arguments(0));
WScript.Echo(oXmlDoc.selectSingleNode(WScript.Arguments(1)).text);
Grüße
rubberman
beidermachtvongreyscull
beidermachtvongreyscull 18.05.2016 um 08:23:26 Uhr
Goto Top
Ginge vielleicht auch ein Commandline-Parser?
https://sourceforge.net/projects/xmlstar/files/

Vielleicht vereinfacht das die Lösung.
Angeblich kannst Du mit diesem Tool XML-Dateien validieren, abfragen, editieren und transformieren.

Ich habe es aber jetzt nicht getestet.
colinardo
colinardo 18.05.2016 aktualisiert um 08:35:37 Uhr
Goto Top
Oder eine andere Variante, ebenfalls in. einer Batch ausführbar:
Powershell -Executionpolicy Bypass -command "([xml](gc 'c:\en.xml')).SelectSingleNode('//urlMain').innerText"  
Das Konstrukt lässt sich ja dann auch direkt in eine FOR-Schleife übernehmen.

Grüße Uwe
pappkamerad
pappkamerad 18.05.2016 um 08:58:07 Uhr
Goto Top
Hallo und danke schon einmal für die Ansätze...

@rubberman:
Leider wirft das Script ein Kompilierungsfehler aus
2.bat(1, 5) Kompilierungsfehler in Microsoft JScript: ';' erwartet  
Da ich mich mit JScript nicht auskennt, kann ich den Fehler nicht beheben.

@beidermachtvongreyscull:
Ich werde mir das Tool mal anschauen, wenn alle Stricke reißen. Aber eigentlich sollte diese kleine Aufgabe doch auch ohne extra Tool lösbar sein. Hoffe ich zumindest.

@colinardo:
Ahh ein Einzeiler. Wäre klasse, wenn das funktioniert. Aber wie setze ich das in einer *.bat ein? Die Zeile liefert mir leider kein Ergebnis bzw. keine Rückmeldung? Gehe ich richtig in der Annahme, dass 'c:\en.xml' der komplette Pfad zu der xml ist?

Ich bitte nochmals um Hilfe.

Grüße
pappakamerad
colinardo
Lösung colinardo 18.05.2016 aktualisiert um 09:20:34 Uhr
Goto Top
Zitat von @pappkamerad:
@colinardo:
Ahh ein Einzeiler. Wäre klasse, wenn das funktioniert. Aber wie setze ich das in einer *.bat ein?
Genau so wie es dort steht face-smile, deswegen habe ich es ja so verpackt.

Wenn du das Ergebnis in einer Variablen brauchst, packst du das ganze in eine FOR-Schleife:
set "xmlpath=C:\en.xml"  
for /f "delims=" %%a in ('powershell -Executionpolicy ByPass -command "([xml](gc '%xmlpath%')).SelectSingleNode('//urlMain').innerText"') do set "result=%%a"  
echo %result%
Die Zeile liefert mir leider kein Ergebnis bzw. keine Rückmeldung? Gehe ich richtig in der Annahme, dass 'c:\en.xml' der komplette Pfad zu der xml ist?
Korrekt.
Läuft hier mit deinem XML-Schnippsel einwandfrei. Ansonsten wurde deine Powershell-Executionpolicy vielleicht noch nicht freigeschaltet oder bei dir per Policy das Ausführen von Powershell verboten.

screenshot

Nutzt dein XML-File anders als oben gepostet vielleicht "XML-Namespaces"?

Grüße Uwe
pappkamerad
pappkamerad 18.05.2016 aktualisiert um 10:05:24 Uhr
Goto Top
Zitat von @colinardo:
... Ansonsten wurde deine Powershell-Executionpolicy vielleicht noch nicht freigeschaltet ...
Richtig. Stand noch auf "Restricted". Ich habe es auf "Unrestricted" umgestellt.

Leider bekomme ich trotzdem keine Rückmeldung. Weder am PS-Prompt noch aus der Batch heraus. face-sad

test

Nutzt dein XML-File anders als oben gepostet vielleicht "XML-Namespaces"?
Nein. Das XML-File ist genau so aufgebaut wie oben zu sehen.

Fehlt da vielleicht noch eine Einstellung?

Grüße
pappkamerad
colinardo
Lösung colinardo 18.05.2016 aktualisiert um 10:22:13 Uhr
Goto Top
Nein da fehlt nichts.

Frage: Ist urlMain exakt richtig wie im XML-FIle geschrieben (Groß und Kleinschreibung ist hier wichtig)

Man kann alternativ auch case-insensitive suchen XPATH lautet dann so:
//*[translate(local-name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='urlmain']
pappkamerad
pappkamerad 18.05.2016 um 10:10:13 Uhr
Goto Top
Vielen Dank Uwe, genau das war es.

Ja, man sollte sowas ja nicht abtippen, sondern kopieren.

Auf jeden Fall vielen Dank für diese schöne knappe Lösung.

Grüße
pappkamerad
colinardo
colinardo 18.05.2016 um 10:11:30 Uhr
Goto Top
Keine Ursache face-smile

Schöne Woche
Grüße Uwe