Page 1 of 1

[Done] 6.30 b6 - XMLNodePath error in return string

Posted: Tue Dec 30, 2025 12:41 pm
by breeze4me
The length of the string returned by the XMLNodePath function is displayed after “Path Len:”, but it outputs strange values like 64, 63, and 68.
It seems the return string of the XMLNodePath function is corrupted.

The issue occurs in both the C and Asm backends of PB 6.30 b6. (x86/x64)

Code: Select all

;
; ------------------------------------------------------------
;
;   PureBasic - Xml
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

#Window     = 0
#TreeGadget = 0
#XML        = 0

; This procedure fills our TreeGadget, by adding the current node
; and then exploring all childnodes by recursively calling itself.
;
Procedure FillTree(*CurrentNode, CurrentSublevel)

  ; Ignore anything except normal nodes. See the manual for
  ; XMLNodeType() for an explanation of the other node types.
  ;
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal
  
    ; Add this node to the tree. Add name and attributes
    ;
    Text$ = GetXMLNodeName(*CurrentNode) + ": " + XMLNodePath(*CurrentNode) + " - Path Len: " + Len(XMLNodePath(*CurrentNode))
    Debug Text$
    
    If ExamineXMLAttributes(*CurrentNode)
      While NextXMLAttribute(*CurrentNode)
        Text$ + " Attribute:" + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " "
      Wend
    EndIf
    
    Text$+ " " + GetXMLNodeText(*CurrentNode)
    
    AddGadgetItem(#TreeGadget, -1, Text$, 0, CurrentSublevel)
        
        
    ; Now get the first child node (if any)
    ;
    *ChildNode = ChildXMLNode(*CurrentNode)
    
    ; Loop through all available child nodes and call this procedure again
    ;
    While *ChildNode <> 0
      FillTree(*ChildNode, CurrentSublevel + 1)
      *ChildNode = NextXMLNode(*ChildNode)
    Wend
  
  EndIf

EndProcedure


Define tempXml.s
tempXml = ~"<Main>" +
          ~"  <t1>" +
          ~"    <element>a1</element>" +
          ~"    <element>a2</element>" +
          ~"    <element>a3</element>" +
          ~"  </t1>" +
          ~"  <t2>" +
          ~"    <t21>" +
          ~"      <element>b1</element>" +
          ~"      <element>b2</element>" +
          ~"      <element>b3</element>" +
          ~"      <element>b4</element>" +
          ~"      <element>b5</element>" +
          ~"      <element>b6</element>" +
          ~"      <element>b7</element>" +
          ~"      <element>b8</element>" +
          ~"      <element>b9</element>" +
          ~"      <element>b10</element>" +
          ~"      <element>b11</element>" +
          ~"      <element>b12</element>" +
          ~"    </t21>" +
          ~"  </t2>" +
          ~"  <t3>" +
          ~"    <element>c1</element>" +
          ~"    <element>c2</element>" +
          ~"    <element>c3</element>" +
          ~"    <element>c4</element>" +
          ~"    <element>c5</element>" +
          ~"    <element>c6</element>" +
          ~"    <element>c7</element>" +
          ~"  </t3>" +
          ~"</Main>"

If ParseXML(#XML, tempXml) And XMLStatus(#XML) = #PB_XML_Success
  
  If OpenWindow(#Window, 0, 0, 500, 500, "XML Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    TreeGadget(#TreeGadget, 10, 10, 480, 480)
    
    ; Get the main XML node, and call the FillTree() procedure with it
    ;
    *MainNode = MainXMLNode(#XML)
    If *MainNode
      FillTree(*MainNode, 0)
    EndIf
    
    ; Expand all nodes for a nicer view
    ;
    For i = 0 To CountGadgetItems(#TreeGadget) - 1
      SetGadgetItemState(#TreeGadget, i, #PB_Tree_Expanded)
    Next i
    
    ; Wait for the window close event.
    ;
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
  
EndIf
Main: /Main - Path Len: 5
t1: /Main/t1 - Path Len: 8
element: /Main/t1/element - Path Len: 16
element: /Main/t1/element[2] - Path Len: 19
element: /Main/t1/element[3] - Path Len: 19
t2: /Main/t2 - Path Len: 8
t21: /Main/t2/t21 - Path Len: 12
element: /Main/t2/t21/element - Path Len: 20
element: /Main/t2/t21/element[2] - Path Len: 64 <---
element: /Main/t2/t21/element[3] - Path Len: 64 <---
element: /Main/t2/t21/element[4] - Path Len: 64 <---
element: /Main/t2/t21/element[5] - Path Len: 64 <---
element: /Main/t2/t21/element[6] - Path Len: 64 <---
element: /Main/t2/t21/element[7] - Path Len: 64 <---
element: /Main/t2/t21/element[8] - Path Len: 64 <---
element: /Main/t2/t21/element[9] - Path Len: 64 <---
element: /Main/t2/t21/element[10] - Path Len: 63 <---
element: /Main/t2/t21/element[11] - Path Len: 63 <---
element: /Main/t2/t21/element[12] - Path Len: 63 <---
t3: /Main/t3 - Path Len: 8
element: /Main/t3/element - Path Len: 16
element: /Main/t3/element[2] - Path Len: 68 <---
element: /Main/t3/element[3] - Path Len: 68 <---
element: /Main/t3/element[4] - Path Len: 68 <---
element: /Main/t3/element[5] - Path Len: 68 <---
element: /Main/t3/element[6] - Path Len: 68 <---
element: /Main/t3/element[7] - Path Len: 68 <---

Re: [6.30 b6] XMLNodePath error in return string

Posted: Tue Dec 30, 2025 1:30 pm
by STARGÅTE
Confirmed.

The string has many space-characters at the end:

Code: Select all

000001A23C2B0750  2F 00 4D 00 61 00 69 00 6E 00 2F 00 74 00 32 00  /.M.a.i.n./.t.2.
000001A23C2B0760  2F 00 74 00 32 00 31 00 2F 00 65 00 6C 00 65 00  /.t.2.1./.e.l.e.
000001A23C2B0770  6D 00 65 00 6E 00 74 00 5B 00 32 00 5D 00 20 00  m.e.n.t.[.2.]. .
000001A23C2B0780  20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
000001A23C2B0790  20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
000001A23C2B07A0  20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
000001A23C2B07B0  20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .
000001A23C2B07C0  20 00 20 00 20 00 20 00 20 00 20 00 20 00 20 00   . . . . . . . .

Re: [6.30 b6] XMLNodePath error in return string

Posted: Wed Dec 31, 2025 10:45 am
by Fred
Good catch, fixed !