XML File Durchsuchen ?

Nabend,
Ich würd gern in einer XML Datei nach einem Wert Suchen der zwischen
… steht.
Wie mache ich das mit Folgendem Code ?

mfg joe

ff = FreeFile
n = 0
Open „d:\HWF.txt“ For Input As #ff
While Not EOF(ff)
Line Input #ff, textvar

n = n + 1
Wend
Close #ff

N’abend Joe,

Ich würd gern in einer XML Datei nach einem Wert Suchen der
zwischen
… steht.

hmmm, da sehe ich das Problem nicht.

Wie mache ich das mit Folgendem Code ?

mfg joe

ff = FreeFile
n = 0
Open „d:\HWF.txt“ For Input As #ff
While Not EOF(ff)
Line Input #ff, textvar

n = n + 1
Wend
Close #ff

*Kopfschüttel* Du willst doch die ganze Datei durchsuchen, was soll da das langsame, zeilenweise Einlesen? Das macht Sinn, aber nicht hier.

Versuch mal:

 Dim ff As Integer
 Dim Txt As String
 Dim Txt\_Part As String
 Dim l As Long
 Dim na As String
 Dim po1 As Long
 Dim po2 As Long

 na = "d:\HWF.txt"
 ff = FreeFile
 l = FileLen(na)
 Txt = Space(l)
 Open na For Binary As #ff
 Get #ff, , Txt
 Close #1
 po1 = InStr(Txt, "") + 6
 po2 = InStr(Txt, "")
 Txt\_Part = Mid(Txt, pos1, pos2 - pos1)

… natürlich ungetestet, sollte aber funktionieren, wenn ich keinen Fehler eingebaut habe. :smile:

Gruß, Rainer

RunTime Error 5
Invalid procedure call or argument

TxtPart = Mid(Txt, pos1, pos2 - pos1)
ich versuche mal bischen rum

mfgjoe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

RunTime Error 5
Invalid procedure call or argument

Mist! So ist das immer, wenn ich ungetesteten Code poste.

TxtPart = Mid(Txt, pos1, pos2 - pos1)
ich versuche mal bischen rum

Nein, debuggen. Du hast den Code von hier, nicht aus der Mail? Da hatte ich erst vergessen, zwischen die Anführungszeichen zu setzen. Ergibt denn Pos2-Pos1 eine positive Zahl? D.H. werden die Tags gefunden? Eventuell solltest Du mal noch außen herum ein …

If pos10 and pos20 then

schreiben, um sicher zu stellen, daß der Code nur Texte bearbeitet, in denen die Tags auch wirklich vor kommen.

Gruß, Rainer

Moin,
HA HA, Manchmal sieht MANN den Wald vor lauter Bäumen nicht :stuck_out_tongue:P

po1 = InStr(Txt, „“) + 6
po2 = InStr(Txt, „“)

TxtPart = Mid(Txt, pos1, pos2 - pos1)

NAchdem ich po1 und po2 ind Pos1 und Pos2 …:stuck_out_tongue:

Diggn Danke !! es Funktioniert.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich habe allerdings 2x Text

und ich brauche den Wert von dem 2t eintrag
Wie kann ich bis zum 2ten „vordringen“ ?

mfg joe

Hi Joe,

Ich habe allerdings 2x Text

und ich brauche den Wert von dem 2t eintrag
Wie kann ich bis zum 2ten „vordringen“ ?

Instr() hat optional als erstes Argument die Startposition. Du brauchst also noch Pos3 als start für Pos1 und mußt Pos1 als Start für für Pos 2 angeben, dann funktioniert das.

Gruß, Rainer

Würdest du mir nochmal anders Umschreiben so wie ich es verstanden habe ist es wohl falsch.

Private Sub Form_Load()
Dim ff As Integer
Dim Txt As String
Dim TxtPart As String
Dim TxTPart2 As String
Dim l As Long
Dim na As String
Dim po1 As Long
Dim po2 As Long

na = „d:\HWF.xml“
ff = FreeFile
l = FileLen(na)
Txt = Space(l)
Open na For Binary As #ff
Get #ff, , Txt
Close #1
po1 = InStr(Txt, „“) + 6
po2 = InStr(Txt, „“)
po3 = InStr(Txt, „“) + 6
po4 = InStr(Txt, „“)
TxtPart = Mid(Txt, po1, po2 - po1)
TxTPart2 = Mid(Txt, po3, po4 - po3)
MsgBox TxtPart
End Sub

mfgjoe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

Du mußt erst das Ende des ersten Auftretens ermitteln und das dann als Startwert verwenden.

Private Sub Form\_Load()
Dim ff As Integer
Dim Txt As String
Dim TxtPart As String
Dim TxTPart2 As String
Dim l As Long
Dim na As String
Dim po1 As Long
Dim po2 As Long
Dim po3 As Long

 na = "d:\HWF.xml"
 ff = FreeFile
 l = FileLen(na)
 Txt = Space(l)
Open na For Binary As #ff
 Get #ff, , Txt
Close #1
 po1 = InStr(Txt, "")
 po2 = InStr(po1, Txt, "") + 6
 po3 = InStr(po2, Txt, "")
 TxtPart = Mid(Txt, po2, po3 - po2)
 MsgBox TxtPart
End Sub

Probier das mal, wieder ungetestet.

Gruß, Rainer

Sehr Gut !! Danke !!

mfg Joe

Hallo Joe,

lade den Text in ein XmlDokument und benutze XPath. Ich werd morgen mal ein Beispiel raussuchen.
Im Prinzip:

Dim doc As XMLDocument
Dim node As XMLElement
doc.loadXML ("")
node = doc.selectSingleNode("//text[. = 'meinText']")

mfg

Dirk.Pegasus

Nabend,
ich habe hier ein XML File und möchte immer zwischen …paar zeilen tiefer… die Felder

469379A.20233J032900051WID
Einlesen. es gibt12-18 Unit Angaben pro XML File die ich alle ausgeben möchte ? wie müsste ich das antstellen ?

Die einzelnen Unit felder sehen wie folgt aus. Danke mfg joe

  • 1171Nounblocked332010Nenabled469379A.20213J032900051412working0Detected1WID

N’Abend Joe,

ich habe hier ein XML File und möchte immer zwischen
…paar zeilen tiefer… die Felder

469379A.202
3
3J032900051
WID
Einlesen. es gibt12-18 Unit Angaben pro XML File die ich alle
ausgeben möchte ? wie müsste ich das antstellen ?

Mehrere. die alle mit anfangen, dabei kann die Anzahl verschieden sein? Das ist ein Fall für Split!

Option Explicit
 Dim Text As String

Private Sub Command1\_Click()
 Dim Teil() As String

 Teil = Split(Text, "")
 For i = LBound(Teil) To UBound(Teil)
 List1.AddItem Left(Teil(i), InStr(Teil(i), ""))
 Next
End Sub

Gruß, Rainer

Nabend Rainer,
Irgendwie spuckt er noch nichts aus. Aber mit dem Code frage ich doch nur die erste Unit ab oder ? also Unit bis /Unit

mfg joe

Private Sub Form\_Load()
 Dim ff As Integer
 Dim Txt As String
 Dim na As String
 Dim i As Integer
 Dim Teil() As String


 na = "d:\HWInformation.xml"
 ff = FreeFile
 Txt = Space(l)

 Open na For Binary As #ff
 Get #ff, , Txt
 Close #1
 
 Teil = Split(Txt, "")
 For i = LBound(Teil) To UBound(Teil)
 List1.AddItem Left(Teil(i), InStr(Teil(i), ""))
 Next

End Sub

[MOD] Pre-Tag eingefügt und ToFu beseitigt.

Hi Joe,

erst mal … es wäre nett, wenn Du mal selbst den Pre-Tag schreibst, Der Beitrag wird davon leichter lesbar. Es ist auf dauer lästig, wenn ich Deinen Beitrag immer erst bearbeiten muß, bevor ich die Frage verstehe. Texte, die Du nicht benötigst, darfst Du auch gern entfernen, ToFu (Text oben FullQuoting unten) ist auch nicht so beliebt. So, genug gemeckert, nun zum Problem.

Irgendwie spuckt er noch nichts aus.

Dann kann nur der Delimiter falsch sein. Wenn Du ‚Unit‘ angibst und im Text steht ‚unit‘ oder ‚UNIT‘, funktioniert es nicht. Wenn die Schreibweise unklar ist, kannst Du den Text mit Ucase komplett in Großbuchstaben ändern und bist dieses Problem los.

Aber mit dem Code frage
ich doch nur die erste Unit ab oder ? also Unit bis /Unit

Nein, das ist ja das besondere an Split. Split teil Deinen Text auf und übergibt ihn an ein Array, geteilt wird er überall, wo der Delimiter gefunden wird. Ein Beispiel:

aaaaaaaaa#bbbbbbbb#ccccccccccc

wird mit

Dim Teil() As Integer
Text = „aaaaa#bbbbbbbbbbb#ccccccccccc“
Teil = Split(Text, „#“) aufgeteilt in

Teil(0) = aaaaaa
Teil(1) = bbbbbbbbbb
Teil(2) = cccccccccc

Der Delimiter (hier das ‚#‘) wird dabei entfernt, das Array bekommt in diesem Fall drei Felder. Das können auch hunderte sein. Du siehst, daß das Array Teil erst mal ohne Größenangabe deklariert ist, Split wirkt wie Redim, legt die Anzahl Felder fest.

Versuche es noch einmal mit nur großen oder nur kleinen Buchstaben, das ist die einzige Fehlerquelle, die ich sehe.

Gruß, Rainer

Ich hoffe ich mache es nun richtig :/ sorry.
Mein Problem beginnt hier:

 na = "d:\HWInformation.xml"
 ff = FreeFile
 Txt = Space(l)

 Open na For Binary As #ff
 Get #ff, , Txt
 Close #ff

 List1.AddItem Txt
 TXT ist Leer ?

Mit dem InStr hatte ich aber Informationen bekommen. hmpf
 po1 = InStr(Txt, "")
 po2 = InStr(po1, Txt, "") + 6
 po3 = InStr(po2, Txt, "")
 TxtPart = Mid(Txt, po2, po3 - po2)
 MsgBox TxtPart

Hi Joe,

Ich hoffe ich mache es nun richtig :confused: sorry.

*gg* nein. :smile: Der Pre-Tag gehört nur um den Quellcode. Dadurch bleibt er strukturiert und hebt sich vom Text ab … das üben wir noch. *fg*

Mein Problem beginnt hier:

 na = "d:\HWInformation.xml"
 ff = FreeFile
 Txt = Space(l)

Du legst für die Variable Txt die Größe fest, die in ‚l‘ steht. ‚l‘ ist aber hier Null, Txt soll also keine Zeichen enthalten … Du hast vergessen …

l = Filelen (na)

 Open na For Binary As #ff
 Get #ff, , Txt
 Close #ff

 List1.AddItem Txt

TXT ist Leer ?

ja, muß. Sorry, das habe ich vorhin übersehen. Ich habe beim Laden keinen Fehler erwartet.

Gruß, Rainer

Ok, nun hat es klick gemacht … :frowning:
Es Funktioniert, nun hatte ich im Kopf die Sub schon fertig geschrieben … aber es gab da ja noch dieses Problem ://

Invalid Procedur call or argument
(Txt_Part = Mid(HWLine, pos1, pos2 - pos1)'siehe unten.
wenn ich mir HWLine in der HWView Funktion anzeigen lasse ist alles ok. Also die Unit Informationen sind drin.

Public HWLine As String
...
Teil = Split(Txt, "")
For i = LBound(Teil) To UBound(Teil)
HWLine = Left(Teil(i), InStr(Teil(i), ""))

ViewUnit 

Next

Private Sub ViewUnit()
 
 Dim Txt\_Part As String
 Dim pos1 As Long
 Dim pos2 As Long
 
 pos1 = InStr(HWLine, "") + 14
 pos2 = InStr(HWLine, "")
 Txt\_Part = Mid(HWLine, pos1, pos2 - pos1)
 List1.AddItem Txt\_Part
End Sub

Hi Jo,

Es Funktioniert, nun hatte ich im Kopf die Sub schon fertig
geschrieben … aber es gab da ja noch dieses Problem ://

Invalid Procedur call or argument
(Txt_Part = Mid(HWLine, pos1, pos2 - pos1)'siehe unten.
wenn ich mir HWLine in der HWView Funktion anzeigen lasse ist
alles ok. Also die Unit Informationen sind drin.

OK.

Public HWLine As String

Teil = Split(Txt, „“)
For i = LBound(Teil) To UBound(Teil)
HWLine = Left(Teil(i), InStr(Teil(i), „“))

ViewUnit

Next

Private Sub ViewUnit()

Dim Txt_Part As String
Dim pos1 As Long
Dim pos2 As Long

pos1 = InStr(HWLine, „“) + 14
pos2 = InStr(HWLine, „“)
Txt_Part = Mid(HWLine, pos1, pos2 - pos1)
List1.AddItem Txt_Part
End Sub

Der Fehler tritt auf, wenn ‚‘ nicht enthalten ist. Dann ist pos1=0 und pos2=0. Wenn ich nun die Variablen durch Zahlen ersetze, steht da:

Txt_Part = Mid(HWLine, 0, 0)

Das Zeichen Null gibt es aber nicht, Ein String beginnt mit Zeichen 1.

Um den Fehler zu vermeiden sollte da stehen:

If Pos1 0 And Pos2 0 Then
 Txt\_Part = Mid(HWLine, pos1, pos2 - pos1)
Else
 Txt\_Part = ""
End If

Ich vermute, das ist das Problem. U.U. kann das auch wieder durch die Schreibweise ausgelöst werden, wenn nach großen Zeichen gesucht wird, wo kleine stehen oder umgekehrt.

Ich würde der Schreibweise nicht trauen und es so schreiben:

pos2 = InStr(UCase(HWLine), „“)

Oder kommt der String gar nicht in der Prozedur an?

Public HWLine As String 

geht doch so gar nicht in der Form, oder irre ich mich da?

(Ja, war ein Irrtum, ich habe inzwischen nachgesehen. Public ist hier trotzdem eher nicht angebracht.)

Wenn Du einen bestimmten String an eine Prozedur übergeben willst, geht das so:

ViewUnit HWLine

Private Sub ViewUnit(ByVal HWLine as String)
'....
End Sub

Und wenn Du einen Wert zurück haben möchtest, machst Du eine Funktion daraus. Ach ja, die Deklaration oben fällt dann natürlich weg, führt zu einem Fehler.

Gruß, Rainer

Hallo Joe,

Warum quälst du dich mit solchen String Operationen? XML sollte man mit „adäquaten“ MItteln bearbeiten. Keine Scheu, es ist zwar (wahrscheinlich) erstmal neu, bietet aber schöne Möglichkeiten.

'der str enthält das XML als String
Dim node As Variant
Dim doc As Variant
Dim str As String
Dinm innerStr As String
Set doc = CreateObject("MSXML2.DOMDocument")
actsDoc.loadXml (str)
For Each node In actsDoc.selectNodes("//\_productCode")
 innerStr = node.InnerText
Next

Außer den Verweisen auf VBA und MS Excel 10.0 habe ich noch einen Verweis auf MS Forms 2.0

Es aknn auch sein, dass MSXML dazu installiert sein muss.

Aber: XML sollte me auch mit Xml behandelt werden. Alles aneder ist auf Dauer mühselig und fehleranfällig.
mfg

Dirk.Pegasus