2016-07-29 12 views
0

Ich habe XML-Datei und müssen die erforderlichen Tags Werte extrahieren und das Ergebnis in CSV-Datei mit Tag-Namen hat Header und unter seinem Wert ausgeben.Erhalten von Tags Wert aus Xml-Datei und Speichern von Ergebnissen in CSV-Datei mit Batch-Skript

soweit was ich versucht habe, bekommt das XML-Tag und die Werte, aber alle Ergebnisse werden in 1 Spalte statt wie Tabellenformat angezeigt.

XML-Datei Inhalt (Teil-Dateiinhalt):

<RSP> 
<HSI> 
<SN>CZ9V  </SN> 
<SP>Pro Gen8</SP> 
<UUID>C9V</UUID> 
</HSI> 
<STP>3</STP> 
<cUUID>343-11</cUUID> 
<NICS> 
<NIC> 
<PORT>1</PORT> 
<MACADDR>01:51:f2</MACADDR> 
</NIC> 
<NIC> 
<PORT>1</PORT> 
<MACADDR>00:17</MACADDR> 
</NIC> 
<NIC> 
<PORT>2</PORT> 
<MACADDR>77:28:02</MACADDR> 
</NIC> 
<NIC> 
<PORT>3</PORT> 
<MACADDR>00:04</MACADDR> 
</NIC> 
<NIC> 
<PORT>4</PORT> 
<MACADDR>00:06</MACADDR> 
</NIC> 
</NICS> 
</RSP> 

Ausgang ist aus output.csv Datei bekommen:

SN,SP,UUID,MACADDR,cUUID 
CZ9V 
Pro Gen8 
C9V 

01: 51: f2 343-11

Was Ich wollte bekommen ist:

SN,SP,UUID,MACADDR,cUUID 
CZ9V,Pro Gen8,C9V,01:51:f2,343-11 

Wenn wir die output.csv im Arbeitsblatt öffnen, sollte das obige Ergebnis leicht zu filtern sein, wenn es mit der Filteroption benötigt wird.

-Code so weit sind zu bekommen:

echo SN,SP,UUID,MACADDR,cUUID> %outFile% 
set req_tags=SN SP UUID MACADDR cUUID 
for %%a in (%inFile%) do (
for %%c in (%req_tags%) do (
set "found=" 
set search_tag=%%c 
for /f "tokens=2 delims=>< " %%b in (' type "%%a" ^|findstr /i !search_tag! ') do set found=%%b 
if defined found >> "%outFile%" echo !found! 
) 
) 

müssen den Tag vlaue unter entsprechenden Tag-Namen in output.csv Datei zu erhalten.

+0

Ihre vorgeschlagene Ausgabe ist eine Textdatei mit fester Breite, die völlig anders als eine CSV ist. – dbenham

+0

ok hab es. Ich hätte die erwartete Ausgabe hier nicht formatieren sollen. – HULK

Antwort

0

Da sich die Anforderungen ein wenig geändert haben, habe ich mich dafür entschieden, eine neue Antwort zu veröffentlichen, anstatt die ursprüngliche zu editieren. Nicht sicher, ob das der Weg ist, Dinge zu tun, aber hey, ich versuche mein Bestes ... :)

Hier ist eine Version, die nicht die XML-Hierarchie interessiert, es extrahiert nur Token-Werte aus einer Liste der angegebenen Elemente . Beachten Sie jedoch, dass der Fall, in dem mehrere untergeordnete Elemente zu einem gemeinsamen übergeordneten Element gehören (auch wenn die XML-Hierarchie dies nicht widerspiegelt), wie oben beschrieben, nicht ist. Aber die Ausgabe ist in einer einzigen Zeile, wie Anfrage von der OP:

+0

Danke Filipus. Ihr zweiter Code funktioniert wie erwartet. Das einzige Problem, das ich gesehen habe, ist, wenn das reg_tag mehr als einmal in der Eingabe-XML-Datei vorkommt, dann erhält Ihr Code beide Werte. Wie in meinem Fall erscheint UUID zweimal in der Eingabedatei. – HULK

+0

Ja, das habe ich in meinem Beitrag erklärt: mehrere Kinder können nicht so behandelt werden. Sie könnten Ausnahmen schreiben, um diese Fälle zu behandeln, aber wenn Sie es absolut generisch machen wollen, müssten Sie einen tatsächlichen XML-Parser aus einer Skriptsprache verwenden, wie ich in einem meiner vorherigen Kommentare vorgeschlagen habe. – Filipus

0

Ich habe einen Stich gemacht. Du warst auf dem richtigen Weg. Der folgende Code sieht so aus, als ob er für die von Ihnen geposteten Beispieldaten funktioniert. Er funktioniert weiterhin für alle zusätzlichen Elemente, die Sie innerhalb des HSI-Elements hinzufügen.

Das einzige, was Sie ist die CSV-Kopfzeile ändern müssen, aber man konnte, dass auf die Batchdatei als Parameter wählen zu gelangen oder die Werte in der Batch-Datei selbst zu codieren, wie sie jetzt sind:

@echo off 
setlocal enabledelayedexpansion 
set inFile="C:\tests\xmltocsv.txt" 
set outFile="C:\tests\output.csv" 
if exist %outFile% del %outFile% 
set csvline= 
echo SN SP UUID > %outFile% 
(for /F "delims=" %%a in ('findstr /I /L /V "^<HSI" %inFile%') do (
    if "%%a" EQU "</HSI>" (
    echo !csvline! & set csvline= 
) ELSE (
    set line=%%a & set "line=!line:*>=!" & for /F "delims=<" %%b in ("!line!") do (IF "%%b" NEQ " " (IF "!csvline!" NEQ "" (set csvline=!csvline! %%b) ELSE (set csvline=%%b))) 
) 
)) >> %outFile% 
+0

Dank Filipus, aber wenn ich Ihren Code ausführen, habe ich keinen Wert in der Datei output.csv erhalten. Darüber hinaus wird die Eingabedatei Tags haben und die erforderlichen Tags/Werte unter verschiedenen Eltern-Tags (nicht nur Tags, die darin enthalten sind) Also dachte ich, um eine Variable für ex: requried_tags = "SN SP UUID .. .. ... etc "und im Code sollte es diese Tag-Werte holen und das Ergebnis wird in output.csv mit der ersten Zeile mit dem Tag-Namen und darunter den entsprechenden Wert. Entschuldigung, ich hätte den richtigen input.xml Dateiinhalt nicht nur ein Teil geben sollen. (Ich habe es jetzt aktualisiert) – HULK

+0

ok, ich habe einige Änderungen im Code so definiert requried_tag ​​kann gesucht werden und den Wert an output.csv senden. Es funktioniert, aber alle Tag-Werte werden nacheinander in der ersten Spalte angezeigt. nicht sicher, was ich jetzt tun muss.Bit schlug jede Hilfe/Anregung sehr willkommen. Ich habe den ursprünglichen Code/Ausgabe aktualisiert, was jetzt kommt. – HULK

+0

Ich bin mir nicht sicher, ob ich verstehe, wie Sie feststellen können, welche Tags zu welchem ​​Artikel gehören, wenn sie nicht unter demselben Elternteil gespeichert sind. Ihr Beispiel zeigt, dass Sie Elemente unter dem/NICS/NIC-Element mit einem Element unter dem HSI-Element abgleichen, aber vermutlich könnten Sie mehrere NIC-Elemente haben. Wie würden Sie sie also mit dem entsprechenden HSI-Element abgleichen? Gibt es in Ihrer Eingabedatei mehrere Instanzen von HSI-Elementen? Sind sie unter einem HSIS-Elternteil gruppiert? – Filipus