; ; ------------------------------------------------------------ ; ; PureBasic - Xml ; ; (c) Fantaisie Software ; ; ------------------------------------------------------------ ; #Window = 0 #TreeGadget = 0 #XML = 0 ; Эта процедура заполняет наш TreeGadget, добавляет текущий узел ; и затем исследует все дочерние узлы путем рекурсивного вызова самой себя. ; Procedure FillTree(*CurrentNode, CurrentSublevel) ; Игнорирует все, кроме обычных узлов. См. Руководство по ; XMLNodeType() для объяснения других типов узлов. ; If XMLNodeType(*CurrentNode) = #PB_XML_Normal ; Добавляет этот узел в дерево. Добавляет имя и атрибуты ; Text$ = GetXMLNodeName(*CurrentNode) + " (Attributes: " If ExamineXMLAttributes(*CurrentNode) While NextXMLAttribute(*CurrentNode) Text$ + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " " Wend EndIf Text$ + ")" AddGadgetItem(#TreeGadget, -1, Text$, 0, CurrentSublevel) ; Теперь получим первый дочерний узел (если есть) ; *ChildNode = ChildXMLNode(*CurrentNode) ; Цикл через все доступные дочерние узлы и снова вызовите эту процедуру ; While *ChildNode <> 0 FillTree(*ChildNode, CurrentSublevel + 1) *ChildNode = NextXMLNode(*ChildNode) Wend EndIf EndProcedure FileName$ = OpenFileRequester("Choose XML file...", "", "XML files (*.xml)|*.xml|All files (*.*)|*.*", 0) If FileName$ <> "" If LoadXML(#XML, FileName$) ; Заметка: ; Выполнение LoadXML() будет успешным, если файл может быть прочитан. Это ; не означает, что в XML не было ошибок. Чтобы проверить это, можно ; использовать XMLStatus(). ; ; Отобразит сообщение об ошибке, если произошла ошибка разметки ; If XMLStatus(#XML) <> #PB_XML_Success Message$ = "Error in the XML file:" + Chr(13) Message$ + "Message: " + XMLError(#XML) + Chr(13) Message$ + "Line: " + Str(XMLErrorLine(#XML)) + " Character: " + Str(XMLErrorPosition(#XML)) MessageRequester("Ошибка", Message$) EndIf ; Заметка: ; Даже если в XML произошла ошибка, все узлы разобранные до ошибки будут доступны, ; поэтому откройте окно и покажите дерево в любом случае. ; If OpenWindow(#Window, 0, 0, 500, 500, "XML Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) TreeGadget(#TreeGadget, 10, 10, 480, 480) ; Получить основной узел XML и вызвать его с помощью процедуры FillTree() ; *MainNode = MainXMLNode(#XML) If *MainNode FillTree(*MainNode, 0) EndIf ; Разверните все узлы для более приятного просмотра ; For i = 0 To CountGadgetItems(#TreeGadget) - 1 SetGadgetItemState(#TreeGadget, i, #PB_Tree_Expanded) Next i ; Ожидает закрытия окна. ; Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf Else MessageRequester("Ошибка", "The file cannot be opened.") EndIf EndIf