ich habe ein Problemchen mit einer LinkedList von Typ String.
Ich möchte gerne eine Menge Ergebnisse aus XMLNodePath() Abfragen in der Liste ablegen, diese dann sortieren und von doppelten Einträgen bereinigen. Dabei werden die XPath Ausdrücke ziemlich willkürlich abgeschnitten und damit das Ergebnis verfälscht.
Beispiel eines falschen Ergebnisses:
/dmodule/content/refs/refdm[4]/avee/discod
/dmodule/content/refs/refdm[4]/avee/discode
oder auch
/dmodule/content/refs/refdm[4]/avee/incod
/dmodule/content/refs/refdm[4]/avee/incode
Laut PB-Doku sollte XMLNodePath() eigentlich einen String liefern und ich war bislang der Hoffnung, dass ich diesen auch in einer LinkedList() von Typ String ablegen kann???
Code: Alles auswählen
xml_Pfad.s = PathRequester("Verzeichnis der xml-Dateien auswählen", GetHomeDirectory())
NewList Pfade.s()
NewList Fehlerdateien.s()
Procedure.i search_tag(node_index.i)
If ChildXMLNode(node_index)
ProcedureReturn ChildXMLNode(node_index)
EndIf
If NextXMLNode(node_index)
ProcedureReturn NextXMLNode(node_index)
EndIf
While ParentXMLNode(node_index)
If NextXMLNode(ParentXMLNode(node_index))
ProcedureReturn NextXMLNode(ParentXMLNode(node_index))
EndIf
node_index = ParentXMLNode(node_index)
Wend
ProcedureReturn 0
EndProcedure
Procedure.i kommentare_entfernen(xml.i)
tag.i = search_tag(MainXMLNode(xml))
While tag And tag <> MainXMLNode(xml)
If XMLNodeType(tag) = #PB_XML_Instruction Or XMLNodeType(tag) = #PB_XML_Comment
DeleteXMLNode(tag)
EndIf
tag.i = search_tag(tag)
Wend
EndProcedure
Procedure.i xml_sicher_Laden(Dateiname.s)
If IsXML(1)
FreeXML(1)
EndIf
If LoadXML(1,Dateiname)
If XMLStatus(1) = #PB_XML_Success
kommentare_entfernen(1)
ProcedureReturn 1
EndIf
Debug XMLError(1)
Else
If IsXML(1)
FreeXML(1)
EndIf
EndIf
EndProcedure
If OpenWindow(1, #PB_Ignore, #PB_Ignore, 640, 480, "Ausgabefenster" ,#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ProgressBarGadget(1, 0, 460, 640, 20, 0, 100)
SetGadgetColor(1, #PB_Gadget_FrontColor, $0000FF)
ListViewGadget(2, 0, 0, 640, 420,#PB_ListView_MultiSelect)
ButtonGadget(8, 490, 420, 120, 40, "Auswahl in Zwischenablage kopieren" ,#PB_Button_MultiLine)
Else
End
EndIf
Procedure.i Abbrechen()
Event = WindowEvent()
If Event = #PB_Event_CloseWindow And EventWindow() = 1
End
EndIf
If Or Event = #PB_Event_Gadget And EventGadget() = 4
Abbrechen = 1
EndIf
EndProcedure
Procedure.i laufbalken_fortschreiben(status.i=0)
If status.i = 0
status.i = GetGadgetState(1)
If status < 100
status = status + 1
Else
status = 0
EndIf
SetGadgetState(1,status)
Else
SetGadgetState(1,status)
EndIf
Abbrechen()
EndProcedure
If ExamineDirectory(1, xml_Pfad, "*.xml")
While NextDirectoryEntry(1)
laufbalken_fortschreiben()
xml_nr.i = xml_sicher_Laden(xml_Pfad + "\" + DirectoryEntryName(1))
If xml_nr
node_index.i = (MainXMLNode(xml_nr))
While search_tag(node_index)
If XMLNodeType(node_index) = #PB_XML_Normal
AddElement(Pfade())
Pfade() = XMLNodePath(node_index)
;Debug XMLNodePath(node_index)
EndIf
node_index = search_tag(node_index)
Wend
FreeXML(xml_nr)
Else
AddElement(Fehlerdateien())
Fehlerdateien() = xml_Pfad + "\" + DirectoryEntryName(1)
EndIf
Wend
Else
End ;xml-Verzeichnis nicht inirialisiert
EndIf
SortList(Pfade(),#PB_Sort_Ascending)
;Ergebnisliste bereinigen
aktuell.s = ""
If ListSize(Pfade()) >1
ResetList(Pfade())
While NextElement(Pfade())
If Pfade() = aktuell
DeleteElement(Pfade(),-1)
EndIf
aktuell = Pfade()
Wend
EndIf
ClearGadgetItems(2)
ForEach Pfade()
laufbalken_fortschreiben()
AddGadgetItem(2,-1,Pfade())
;Debug Pfade()
Next
laufbalken_fortschreiben(100)
SetGadgetColor(1, #PB_Gadget_FrontColor, RGB(0,255,0))
If ListSize(Fehlerdateien())
ForEach Fehlerdateien()
Debug Fehlerdateien()
Next
EndIf
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow And EventWindow() = 1 ; If the user has pressed on the close button
Quit = 1
EndIf
If Event = #PB_Event_CloseWindow And EventWindow() = 2 ; If the user has pressed on the close button
CloseWindow(2)
Quit = 1
EndIf
If Event = #PB_Event_Gadget And EventGadget() = 8
ClearClipboard()
For x = 0 To CountGadgetItems(2) -1
If GetGadgetItemState(2,x) = #PB_ListIcon_Selected
SetClipboardText(GetClipboardText() + GetGadgetItemText(2,x) + Chr(13))
EndIf
Next
EndIf
Until Quit = 1