moello
Goto Top

XML Datei über cmd auslesen - nur letzter Wert wird wiedergegeben

Guten Tag,

ich möchte eine XML-Datei über cmd auslesen. Habe mich durch Google gekämpft, aber leider noch keine finale Lösung gefunden.
Momentan arbeite ich mit folgendem Befehl, der auch soweit funktioniert:


for /f "tokens=3 delims=<>" %i in ('findstr "<tns:customerTransactionId>" a.xml') do echo %i>ergebnis.txt

Jedoch wird durch die Schleife nur der zuletzt gefundene Wert im Feld <tns:customerTransactionId> in die Textdatei ausgegeben.
Wie kann ich den Befehl abändern, damit er alle gefundene Werte da reinschreibt? Finden tut er sie ja schon, das sieht man ja beim Durchlauf des Befehls.
Ist dies in dieser Form überhaupt möglich oder muss der Befehl in seiner Struktur komplett verändert werden?

Bin für jede Hilfe dankbar.
Beste Grüße

Content-ID: 393686

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

Ausgedruckt am: 25.11.2024 um 03:11 Uhr

137846
137846 23.11.2018 aktualisiert um 11:46:13 Uhr
Goto Top
ich möchte eine XML-Datei über cmd auslesen
Böser Anfängerfehler. XML Dateien nur mit einem Parser konform nutzen.

Findest du hier genug Beispiele dazu VBS/Powershell/etc.

Gruß A,
moello
moello 23.11.2018 um 11:46:35 Uhr
Goto Top
Wirklich bearbeitet wird die XML ja nicht - außer das reine Auslesen fällt da schon drunter ;)
137846
137846 23.11.2018 aktualisiert um 11:48:19 Uhr
Goto Top
Poste die XML dann können wir dir konkret weiterhelfen. Bitte Codetags verwenden!!
moello
moello 23.11.2018 um 11:55:05 Uhr
Goto Top
Wie gewünscht, allerdings nur ein Ausschnitt der XML. Der Header, sowie der erste Block <tns:responseDetails>.
Von denen gibt es eine ganze Reihe in der Datei, der fett markierte Wert ist der relevante.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<tns:customerResponse xmlns:tns="XXXXX" xsi:schemaLocation="XXXXXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tns:reportFileResponse>
<tns:responseInformation>
<tns:responseType>XXXXX: Transaction file import and initial validation</tns:responseType>
<tns:customerId>1111</tns:customerId>
<tns:senderId>5555</tns:senderId>
<tns:timestamp>2018-09-04T20:35:45.000000000Z</tns:timestamp>
<tns:environment>PRO</tns:environment>
<tns:version>001.20</tns:version>
<tns:inboundFileReference>1234_20180903T000149000_MIXXXXXXT.CSV</tns:inboundFileReference>
<tns:validationResult>File accepted - records with warnings</tns:validationResult>
<tns:totalRecords>22</tns:totalRecords>
<tns:validRecords>0</tns:validRecords>
<tns:warningRecords>22</tns:warningRecords>
<tns:errorRecords>0</tns:errorRecords>
<tns:mifir>
<tns:totalRecordsRegulation>22</tns:totalRecordsRegulation>
<tns:validRecordsRegulation>0</tns:validRecordsRegulation>
<tns:warningRecordsRegulation>22</tns:warningRecordsRegulation>
<tns:errorRecordsRegulation>0</tns:errorRecordsRegulation>
</tns:aaa>
<tns:rejectRecords>0</tns:rejectRecords>
</tns:responseInformation>

<tns:responseDetails>
<tns:fileLineNo>1</tns:fileLineNo>
<tns:tradeDate>2018-09-03Z</tns:tradeDate>
<tns:customerTransactionId>ABCDEF</tns:customerTransactionId>
<tns:recordVersion>1</tns:recordVersion>
<tns:userField1>182469005821631925</tns:userField1>
<tns:userField7>GENERATED BY YYY</tns:userField7>
<tns:reportingObligationEntityId>1111</tns:reportingObligationEntityId>
<tns:reportLevel>T</tns:reportLevel>
<tns:actionType>N</tns:actionType>
<tns:regulation>XYZ</tns:regulation>
<tns:sequence>0</tns:sequence>
<tns:referenceId>IJKLM</tns:referenceId>
<tns:fieldId>CP003</tns:fieldId>
<tns:fieldName>RSTUV</tns:fieldName>
<tns:errorType>warning</tns:errorType>
<tns:errorCode>CP003-CM_TRN-03-0002</tns:errorCode>
<tns:errorDetails>No reporting required</tns:errorDetails>
</tns:responseDetails>
137846
Lösung 137846 23.11.2018 aktualisiert um 12:14:33 Uhr
Goto Top
Ist zwar an einigen stellen nicht valide deine XML (und du hast ihn !trotz Bitte! !ohne! Codetags gepostet face-sad), aber wat solls ....
Bitte:
@echo off
set "filein=D:\test.xml"  
set "fileout=D:\test.txt"  
powershell -Executionpolicy Bypass -NoProfile -Command "([xml](gc '%filein%')).customerResponse.reportfileresponse.responseDetails.customerTransactionId" >"%fileout%"  
Mach et jot, tschö.
moello
moello 23.11.2018 um 12:40:11 Uhr
Goto Top
Sorry der Hinweis zu den Tags kam, wenn ich das richtig sehe, erst mit deinem Edit. Da war ich schon am posten. Nichts für ungut...
Die fehlende Validität liegt daran, dass ich noch Teile anonymisieren musste, wohl nicht sehr gründlich.

Besten Dank jedenfalls für deine Lösung, hat funktioniert.
WinCobold
WinCobold 24.11.2018 um 14:06:39 Uhr
Goto Top
Hallo moello,

auch wenn du jetzt schon eine sehr gute Lösung bekommen hast: Der Grund, dass du bei deinem ursprünglichen Code nur den letzten Wert in der Datei hattest, war das einfache ">". Damit erstellst du bei jeder Ausgabe eine neue Datei, eine bestehende (die in diesem Fall den vorherigen Wert enthält) wird überschrieben. Mit ">>" würdest du alle Werte bekommen, weil dann die Ausgabe an die bestehende Datei angehängt wird. Nur wenn es keine Datei gibt, wird sie neu erstellt.

Gruß vom
WinCobold