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
den Wert auslesen.
Aber beim jetzigen Projekt steht der gesamte Inhalt der XML in einer Zeile
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 304729
Url: https://administrator.de/contentid/304729
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
9 Kommentare
Neuester Kommentar
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
Grüße
rubberman
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);
rubberman
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.
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.
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 , deswegen habe ich es ja so verpackt.@colinardo:
Ahh ein Einzeiler. Wäre klasse, wenn das funktioniert. Aber wie setze ich das in einer *.bat ein?
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.
Nutzt dein XML-File anders als oben gepostet vielleicht "XML-Namespaces"?
Grüße Uwe