sommerzeit
Goto Top

Eine Bestimmte Zeile bzw. ein Wort aus XML mit Bedingung auslesen

Hallo zusammen,

ich möchte mithilfe von einem batch oder vbs eine bestimmte Zeile in XML (noch besser wäre das Wort in der Zeile) auslesen und in eine neue txt schreiben.

die Schwierigkeit hier ist: soll nur aulesen wenn das gesuchte Wort einen Flag hat.

Beispiel das gesuchte Wort ist "Tische"
und hat 3 zeilen darunter einen Flag "Bingo" (ist auch die Schlüssel für eine LÖSUNG)

dann soll Tisch ausgelesen werden sonst nicht.

vielen Dank für eure Hilfe.

hier ist ein Teil der Beispiel Datei:

<Product ID="PT10155" UserTypeID="Produkttyp">
<Name>balicí technika</Name>
<AttributeLink AttributeID="Tische" Mandatory="true">
<MetaData>
<Value AttributeID="kwesto.sortsequence">2000</Value>
<Value AttributeID="Bingo">Y</Value>
</MetaData>
</AttributeLink>
<AttributeLink AttributeID="hledani_balici technika">
</AttributeLink>
<Values>

Content-Key: 139892

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

Printed on: April 19, 2024 at 15:04 o'clock

Member: Edi.Pfisterer
Edi.Pfisterer Apr 06, 2010 at 10:59:20 (UTC)
Goto Top
Hallo!
versuch mal folgenden ansatz (ungetestet )

mein_ergebnis.vbs
zeilennummer = 0
ausgabe = 0
datei= "mein.xml"  
Set fs = CreateObject("Scripting.FileSystemObject")  
Set File = fs.OpenTextFile(datei , 1, true)
Do While not file.AtEndOfStream
        zeilennummer = zeilennummer+1
        zeile = (file.ReadLine)
        if zeilennummer = 3 then
                inhaltneu =  zeile
        end if
                if zeilennummer = 6 AND instr(1, zeile, "bingo", 1) then  
                ausgabe = 1
        end if
Loop

if ausgabe = 1 then
        Wortbeginn = instr(inhaltneu, Chr(34))
        wortende = instr(wortbeginn+1, inhaltneu, Chr(34))
        wort = mid(inhaltneu, wortbeginn+1, wortende-wortbeginn-1)
        datei1 = "neu.txt"  
        set dateineu = fs.opentextfile(datei1, 8, true,0)
        dateineu.write wort & vbcrlf
end if

das sollte dir die gesame 3. Zeile auslesen...
Falls Du nur den Teil zwischen den " brauchst, meld dich ncohmal...

lg
Edi
Member: sommerzeit
sommerzeit Apr 06, 2010 at 11:42:25 (UTC)
Goto Top
Hallo Edi,

vielen Dank für deine schnelle Antwort,

diesen Script funktioniert nur wenn Bingo in Zeile 6 steht, wie oben geschrieben nur Bingo ist der Schlüssel, die Zeilen nur darf mann nicht benutzen, sonst bekommte ich nur eine zeile.

den Teil der XML, ist nur eine Kleine Ausschnitt, in der wirklichkeit hat hat diese Datei 400 000 Zeilen, und Bingo kann 100 000 mal vorkommen.

ich hoffe ich habe es richtig erklärt.

vielen Dank nochmal

gruß sommerzeit
Member: Edi.Pfisterer
Edi.Pfisterer Apr 06, 2010 at 11:52:00 (UTC)
Goto Top
Hallo!
ich bin mir nicht sicher, ob ich Dich richtig verstehe...

Poste mal einen längeren Abschnitt Deiner xml-Datei (zumindest so lange, dass das gesuchte Wort 3 mal und Bingo nur 2 mal vorkommt...), dann kann ich mir das Problem vielleicht besser vorstellen.


ps: falls Du dir mit Englisch leichter tust, ist das für mich kein Problem face-wink

lg
Edi
Member: sommerzeit
sommerzeit Apr 06, 2010 at 12:24:38 (UTC)
Goto Top
Vielen Dank nochmal für deine Hilfe,

hier ist ein größere Textabschnitt.

in diesem Fall soll die Ausgabe wie folgt sein:

<AttributeLink AttributeID="Tische="true">
<AttributeLink AttributeID="Stühle">
<AttributeLink AttributeID="Fenster="true">

Beginn der XML

<Product ID="MT10163" UserTypeID="Merkmalstyp">
<Name>klešte</Name>
<AttributeLink AttributeID="Tische="true">
<MetaData>
<Value AttributeID="kwesto.sortsequence">2040</Value>
<Value AttributeID="Bingo">Y</Value>
</MetaData>
</AttributeLink>
<AttributeLink AttributeID="Stühle">
<MetaData>
<Value AttributeID="kwesto.sortsequence">2080</Value>
<Value AttributeID="Bingo">Y</Value>
</MetaData>
</AttributeLink>
<AttributeLink AttributeID="Wagen" Mandatory="true">
<MetaData>
<Value AttributeID="kwesto.sortsequence">2060</Value>
</MetaData>
</AttributeLink>
<AttributeLink AttributeID="Fenster="true">
<MetaData>
<Value AttributeID="kwesto.sortsequence">2020</Value>
<Value AttributeID="Bingo">Y</Value>
</MetaData>
<AttributeLink AttributeID="pro vysku spony" Mandatory="true">
<MetaData>
<Value AttributeID="kwesto.sortsequence">3020</Value>
</MetaData>
</AttributeLink>
<AttributeLink AttributeID="druh ovladani" Mandatory="true">
<MetaData>
<Value AttributeID="kwesto.sortsequence">3010</Value>
</MetaData>
Member: Edi.Pfisterer
Edi.Pfisterer Apr 06, 2010 at 12:43:45 (UTC)
Goto Top
Hallo!
Ich gehe jetzt mit meiner Holden ein bissl spazieren, schreib Dir den entsprechenden code aber am Abend beim Fernsehen, wenn ich heimkomme ...

lg
Edi
Member: bastla
bastla Apr 06, 2010 at 12:44:39 (UTC)
Goto Top
@Edi
Als Ansatz (komme gerade auch nicht gut dazu):
Inhalt = Split(fs.OpenTextFile(datei), vbCrLf)
For i = 0 To UBound(Inhalt)
   ...
In einem Array lässt sich's leichter "nach vorne" schauen ...

... und die 400000 Zeilen werden ja wohl im Speicher Platz haben ... face-wink

Grüße
bastla
Member: Edi.Pfisterer
Edi.Pfisterer Apr 06, 2010 at 13:16:40 (UTC)
Goto Top
@ bastla:
danke für deine Anmerkung, habs jetzt aber doch anders gemacht...

@sommerzeit:
meine Freundin hat uns noch schnell einen Imbiss zubereitet, damit wir uns gestärkt auf den Weg machen können...
(und die Zeit hat zu folgendem - getestetem - Ergebnis gereicht):

datei= "mein.xml"  
Set fs = CreateObject("Scripting.FileSystemObject")  
Set File = fs.OpenTextFile(datei , 1, true)
Do While not file.AtEndOfStream
        zeile = (file.ReadLine)
        if instr(zeile, "AttributeLink AttributeID") >= 1 then  
                temp = zeile
        end if
        if instr(1, zeile, "bingo", 1) then  
        call schreiben(temp)
        end if
Loop

function schreiben(inhalt)
        datei1 = "neu.txt"  
        set dateineu = fs.opentextfile(datei1, 8, true,0)
        dateineu.write inhalt & vbcrlf
end function

lg
Edi
Member: sommerzeit
sommerzeit Apr 06, 2010 at 13:38:35 (UTC)
Goto Top
Hallo Edi und Bastler,

Vielen herzlichen Dank, es hat SUPER funktioniert.
Member: bastla
bastla Apr 06, 2010 at 13:52:05 (UTC)
Goto Top
Hallo Edi!

Lässige Lösung - ich hätte das "3 zeilen darunter" unnötig ernst genommen ... face-smile

Grüße
bastla
Member: Edi.Pfisterer
Edi.Pfisterer Apr 06, 2010 at 17:57:13 (UTC)
Goto Top
@ sommerzeit:
gern geschehen, freut mich, wenn ich Dir helfen konnte...

@ bastla:
Danke für die Blumen - da sie von Dir kommen, freut mich das Lob besonders... face-wink
lg
Member: bastla
bastla Apr 06, 2010 at 20:26:35 (UTC)
Goto Top
[OT]
@Edi
Danke für die Blumen
Ich müsste lügen, wenn ich behaupten würde, dass ich derlei virtuelle Pflänzchen nicht selbst gerne entgegennehme - daher reiche ich sie auch mit Freude weiter (besonders, wenn mir eine Lösung so gut gefällt) ... face-smile
[/OT]

Grüße
bastla