flusenhirn
Goto Top

Bestimmten Bereich aus XML auslesen und Werte in anderer Reihenfolge ausgeben

Hallo Leute,
ich hab zwar versucht, mein Problem durch Google, Studienkollegen sowie Try & Error selbst zu lösen... komme irgendwie aber (trotz der echt genialen Hilfen hier) absolut nicht weiter... hab leider bisher auch kaum was mit Batch gemacht!

Ich habe eine XML die gekürzt so aussieht:

<Directory Name="Hauptverzeichnis">
<Directory Name="Unterverzeichnis1">
<File Name="datei1" Size="551118" TTH="12345"/>
<File Name="datei2" Size="524951" TTH="54321"/>
<Directory Name="Unterunterverzeichnis1">
<File Name="datei1" ...
</Directory>
</Directory>
<Directory Name="Unterverzeichnis2">
<Directory Name="Unterunterverzeichnis1">
<File Name="datei1" ...
</Directory>
<Directory Name="Unterunterverzeichnis2">
<File Name="datei1" ...
</Directory>
<File Name="datei1" ...
</Directory>
</Directory>

Von dieser Xml möchte ich alle Einträge (File, Size, TTH) aus Unterverzeichnis2 (& dessen Unterverzeichnissen) auslesen und diese dann in einer txt abspeichern.
Wobei in der txt zwischen den drei Werten noch jeweils Text eingefügt werden soll (z.B. blablaTTHblablaNAME bla Size)

Aufgrund meiner bisherigen Programmierkenntnisse versuche ich z.Z. diesen Grundgedanken umzusetzen...:

set XMLDATEI=liste.xml
set zähler1=0
set zähler2=1
für jede Zeile in (%XMLDATEI%) do (
wenn zähler1=1 do (
wenn in Zeile "<File Name=" do (
Name, Size, TTH auslesen & echo als text-Name-text-TTH-text-Size >> neu.txt
)
wenn in Zeile "<Directory Name=" set zähler2=+1
wenn in Zeile "</Directory>" set zähler2=-1
wenn zähler2=0 set zähler1=0
)
wenn in Zeile "<Directory Name="Unterverzeichnis2">" set zähler1=1
)

...wäre das in der Art überhaupt möglich über Batch oder lieg ich hier schon im Ansatz falsch?

Hoffe habe einigermassen Verständlich mein Problem schildern können & hoffe ihr könnt
mir evtl. helfen bzw. mir nen guten Lösung-/Denkansatz geben...
vielen Dank schonma!

gruß,
flusen

Content-Key: 85891

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

Printed on: April 24, 2024 at 22:04 o'clock

Member: bastla
bastla Apr 19, 2008, updated at May 28, 2013 at 16:25:13 (UTC)
Goto Top
Hallo flusenhirn und willkommen im Forum!

...wäre das in der Art überhaupt möglich über Batch oder lieg ich hier schon im Ansatz falsch?
Ein klares "Jein" dazu (zu beiden Teilen der Fage) face-wink.

Eine Umsetzung in Batch wäre zwar grundsätzlich möglich, aber wegen der in der Datei enthaltenen "<", ">" und Anführungszeichen eher mühsam.

Zum Algorithmus: Mit "Zähler2=1" zu beginnen, wird es (soferne die <Directory>- und </Directory>-Tags ordnungsgemäß paarweise gesetzt sind), unmöglich machen, dass der Zähler2 jemals 0 wird (bereits beim Auswerten der ersten Zeile erhöht sich der Zähler auf 2) ...

Mein Ansatz wäre, solange das gewünschte Unterverzeichnis nicht gefunden wurde, die Verzeichnisebenen gar nicht zu zählen, und dann auch zunächst von 0 auszugehen (das gesuchte "Unterverzeichnis2" erhöht dann den Zähler ohnehin schon auf 1, und beim Ende dieses Verzeichnis-Blocks wird dann wieder 0 erreicht).

Aufgrund des besseren Handlings von Sonderzeichen im Text würde ich zu VBScript greifen und hätte folgenden Entwurf anzubieten:
'ExtractFromXMLDirList.vbs  
XMLDatei = "liste.xml"  
NeuDatei = "neu.txt"  
Verz = "Unterverzeichnis2"  
Text = "blabla"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Zeilen = Split(fso.OpenTextFile(XMLDatei).ReadAll, vbCrLF)

Set Neu = fso.CreateTextFile(NeuDatei, True)

Z1 = 0
For Each Zeile In Zeilen
	If InStr(Zeile, Verz) Then
                Z1 = 1
                Z2 = 0
        End If
	If Z1 = 1 Then
		If InStr(Zeile, "<File Name=") Then  
			Felder = Split(Zeile, """")  
			Neu.WriteLine Text & "-" & Felder(1) & _  
				"-" & Text & "-" & Felder(5) & _  
				"-" & Text & "-" & Felder(3)  
		End If
		If InStr(Zeile, "<Directory Name=") Then Z2 = Z2 + 1  
		If InStr(Zeile, "</Directory>") Then Z2 = Z2 - 1  
		If Z2 = 0 Then Exit For
	End If
Next
Neu.Close
Ein weiterer (kleiner) Vorteil von VBS gegenüber Batch ist, dass eine Schleife auch vorzeitig verlassen werden kann, was ich am Ende des "Unterverzeichnis2"-Blocks (wenn Z2 wieder 0 wird) auch nutze.

Grüße
bastla