nulpen
Goto Top

XML nach bestimmten Feldern auslesen und in CSV exportieren

Hallo zusammen,

ich habe verschiedene TIPPS zur Umwandlung und auslesen hier im Forum schon durchgestöbert aber noch nichts zu meiner XML-Struktur gefunden

Folgende XML-Struktur (Auszüge)

<Fields>
<Field Name="TimeStamp">
2010-12-09 08:52:28
</Field>
<Field Name="GUID">
86A8B71C-FE16-4DF5-B501-33C5498966C1
</Field>
<Field Name="DOC-GUID">
21E946FE-9B10-49FF-9A8A-E2C8A02C6BF2
</Field>
<Field Name="Personalnummer_Eingabefeld">
00002
</Field>
<Field Name="Vorname_Eingabefeld">
Mark
</Field>

Diese Blöcke kommen in der XML-Datei mehrfach vor und ich möchte jetzt ausgewählte Felder in eine CSV/TXT-Datei bekommen.

Nehmen wir an die Felder GUID und Personalnummer_Eingabefeld würden benötigt

Alles was ich dankenswerterweise bisher hier gefunden habe geht von

<FELD1>Test</FELD1>
<FELD2>Test</FELD2>

Strukturen aus.

Idealzustand wäre jetzt eine CSV mit folgenden Inhalten

Zeile 1 "GUID","Personalnummer_Eingabefeld"
Zeile 2 "86A8B71C-FE16-4DF5-B501-33C5498966C1","00002"
Zeile 3 usw. die nächsten gefundenen Werte

Wahscheinlich würde schon eine XSL-Datei ausreichen ?

Danke für die Hilfe

Ralf

Content-Key: 156962

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

Printed on: April 23, 2024 at 18:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Dec 14, 2010 at 18:15:28 (UTC)
Goto Top
moin Ralf,

im Moment ist weder der genaue Aufbau Deiner XML, noch der CSV bekannt.

in Zeile 1 der CSV sollen die Werte aus </Field Name="INHALT"> nacheinander eingetragen werden. Zeile 1 ist aber nach dem zweiten Eintrag schon voll.
in Zeile 2 der CSV sollen die Werte jeweils eine Zeile nach </Field Name="INHALT"> nacheinander eingetragen werden - und ist auch nach dem zweiten Eintrag schon voll.

was soll dann in Zeile 3 stehen? </Field>

so wie Du den Aufbau der CSV Beschreibst, ist in Zeile 1 der nächste </Field Name="INHALT ..."> einzufügen oder wie?

Gruß Phil
Member: nulpen
nulpen Dec 14, 2010 at 20:36:02 (UTC)
Goto Top
Hallo Phil,

da ich die Daten später mit Excel weiterverarbeiten werde könnte ich sogar auf die "Überschriften" verzichten.

Genau diese sind mein Problem, wann immer ich mit XML zu tun habe und hier und auch bei Google nach
Hilfe gesucht habe wird von den TAGS ausgangen wie ich Sie als Muster aufgeführt habe.

Konkret brauche ich den Wert der zwischen

<Field Name="GUID">
und </Field> steht (in diesem Fall 86A8B71C-FE16-4DF5-B501-33C5498966C1)

GUID wäre dann die spätere Spaltenbezeichnung.

Ich kann ein bischen was mit regulären Ausdrücken möchte die Sache aber automatisiert als Batch ablaufen lassen.

Da diese Gruppe an TAGS (und noch mehr) mehrfach in der XML vorkommen dachte ich umgangsprachlich an folgendes:

"Suche in der XML-Datei bis Du "Field Name=GUID" + Field Name="Personalnummer_Eingabe" usw findest und schreibe
die jeweils nachfolgenden Werte in eine Zeile einer Textdatei mit ";" getrennt.
Sobald Du beim nächsten "Field Name=GUID" ankommst beginnst Du eine neue Zeile und schreibst die nächsten Werte in eine
neue Zeile."

Wie gesagt es gibt hierfür Lösungen im Netz die aber immer nur nach dem Wert zwischen <FELD1> und <\Feld> suchen und diesen auch finden.

Mein Problem ist daß mein Anfangswert <FELD1 Name="xyz"> heißt und dann erst der Wert kommt den ich brauche.

Welceh Systax brauche ich um an diesen Tag und den nachfolgenden Wert zu kommen.

Danke für Deine Antwort


Ralf
Member: Connor1980
Connor1980 Dec 16, 2010 at 12:16:48 (UTC)
Goto Top
Hallo Ralf,

einfacher wäre es, wenn die Felder nochmal in Node gruppiert wären, dann könntest du das nach diesem Beispiel erledigen.

Grüße
Member: pieh-ejdsch
pieh-ejdsch Dec 16, 2010 at 21:19:45 (UTC)
Goto Top
moin Ralf,

hier ist das Script welches Deine Aufgabe löst.

du kannst die Batch auch mit einem Parameter, welcher die XML-Datei ist aufrufen oder in der Batch den Namen angeben.
die csv wird im gleichen Verzeichnis erzeugt.

wenn Du mehr Kopfdaten als 9 hast must Du die Nummerierung mit Kopfdaten01-Kopfdaten99 machen.

@echo off&setlocal

REM "Suche in der XML-Datei bis Du "Field Name=GUID" + Field Name="Personalnummer_Eingabe" usw findest und schreibe die jeweils nachfolgenden Werte in eine Zeile einer Textdatei mit ";" getrennt. Sobald Du beim nächsten "Field Name=GUID" ankommst beginnst Du eine neue Zeile und schreibst die nächsten Werte in eine neue Zeile."  

:: XML-Datei angeben oder als ersten parameter der Batch uebergeben
set "XML-Name=%~1"  
if not defined XML-Name set "XML-Name=D:\Adminhelp\XML-test.XML"  

set KopfDaten1="GUID"  
set KopfDaten2="Personalnummer_Eingabefeld"  
::mehr Kopfdaten mit: set Kopfdaten3=...

::Ueberschrift ausblenden: set "Ueberschrift=" 
set "Ueberschrift=1"  

set "DatenLesenVorn=<Field Name="  
set "DatenLesenHinten=>"  

set "EndeDatenLesen=</Field>"  


if defined Ueberschrift (
	set "Ueberschrift="  
	for /f "tokens=1* delims==" %%i in ('set Kopfdaten') do (  
		if defined Ueberschrift (setlocal enabledelayedexpansion
			for /f "delims=" %%k in ("!Ueberschrift!") do endlocal&set "Ueberschrift=%%k,%%j"  
		) else set "Ueberschrift=%%j"  
)	)

(
type "%XML-Name%"  
setlocal enabledelayedexpansion
echo.
echo.!DatenLesenVorn!!KopfDaten1!!DatenLesenHinten!
endlocal
)>"%temp%\XML"  

(
for /f "usebackq delims=" %%a in ("%temp%\XML") do (  
	for /f "tokens=1* delims==" %%b in ('set KopfDaten') do (  
		setlocal EnableDelayedExpansion
		Rem wenn KopfZeile gesetzt und gefunden dann zeige Ergebnis der Zeile
		if "%DatenLesenVorn%!Zeigen!%DatenLesenHinten%" == "%%a" (  
			if defined Line (
				if defined Ueberschrift echo.!Ueberschrift!
				echo.!Line!
			)
			endlocal
			if defined Line set "Ueberschrift="  
			set "Line="  
		) else endlocal
		if "%DatenLesenVorn%%Kopfdaten1%%DatenLesenHinten%" == "%%a" if not defined Zeigen set "Zeigen=%Kopfdaten1%"  
		if "%EndeDatenLesen%" == "%%a" set "Lesen="  
		setlocal enabledelayedexpansion
		if "!Lesen!" == "%%c" (  
			endlocal
			if defined Line (
				setlocal enabledelayedexpansion
				for /f "delims=" %%d in ("!Line!") do endlocal&set "Line=%%d;%%a"  
			) else set "Line=%%a"  
		) else endlocal
		if "%DatenLesenVorn%%%c%DatenLesenHinten%" == "%%a" set "Lesen=%%c"  
)	)
)>%XML-Name:~0,-4%.csv
del "%temp%\XML"  

Gruß Phil
Member: nulpen
nulpen Jan 18, 2011 at 21:26:56 (UTC)
Goto Top
Hallo Phil,

Danke, das war es !!!!!!!

Ich war bis 10.01. an anderen Dingen dran deshalb erst jetzt die Antwort

!!!!
Super