XML decoding help needed again. Pointers and recursive stuff

Just starting out? Need help? Post your questions and find answers here.
User avatar
Fangbeast
PureBasic Protozoa
PureBasic Protozoa
Posts: 4789
Joined: Fri Apr 25, 2003 3:08 pm
Location: Not Sydney!!! (Bad water, no goats)

XML decoding help needed again. Pointers and recursive stuff

Post by Fangbeast »

Trying to process an IMDB movie data file (XML format) and don't really understand what I am doing with recursion and pointers and need some help.

Code: Select all

Structure MovieData
  MoviePlot.s
  MovieCategory.s
  MovieTitle.s
  MovieDirectors.s
  MovieWriters.s
  MovieActors.s
EndStructure

Global Movie.MovieData

Declare   ImportImdbDataFile()
Declare   ImportImdbDataFile_XML(*CurrentNode, CurrentSublevel.i)

Procedure ImportImdbDataFile_XML(*CurrentNode, CurrentSublevel.i)

  Protected NodeName.s, *ChildNode, AttributeName.s, FilenameString.s, PictureFileName.s, *Buffer
  Protected FileSize.i, PictureFileHandle.i, FileNamesCountLoop.i, FileNamePart.s
  Protected FileExtensionPart.s, Separator.s
  
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal
    NodeName.s = GetXMLNodeName(*CurrentNode)
    If NodeName.s = "title"
      Movie\MovieTitle = GetXMLNodeText(*CurrentNode) + #LF$
      If Movie\MovieTitle <> ""
        Debug "Plot:      " + Movie\MoviePlot
        Debug "Category:  " + Movie\MovieCategory
        Debug "Title:     " + Movie\MovieTitle
        Debug "Directors: " + Movie\MovieDirectors
        Debug "Writers:   " + Movie\MovieWriters
        Debug "Actors;    " + Movie\MovieActors
      EndIf
    ElseIf NodeName.s = "plot"
      Movie\MoviePlot = GetXMLNodeText(*CurrentNode) + #LF$
    ElseIf NodeName.s = "genres"
      If ExamineXMLAttributes(*CurrentNode)
        While NextXMLAttribute(*CurrentNode)
          AttributeName.s         = XMLAttributeName(*CurrentNode)
          If AttributeName.s      = "item"
            Movie\MovieCategory + XMLAttributeValue(*CurrentNode) + ","
          EndIf
        Wend
      EndIf
    ElseIf Nodename.s = "directors"
      If ExamineXMLAttributes(*CurrentNode)
        While NextXMLAttribute(*CurrentNode)
          AttributeName.s         = XMLAttributeName(*CurrentNode)
          If AttributeName.s      = "item"
            Movie\MovieDirectors + XMLAttributeValue(*CurrentNode) + ","
          EndIf
        Wend
      EndIf
    ElseIf NodeName.s = "writers"
      If ExamineXMLAttributes(*CurrentNode)
        While NextXMLAttribute(*CurrentNode)
          AttributeName.s         = XMLAttributeName(*CurrentNode)
          If AttributeName.s      = "item"
            Movie\MovieWriters + XMLAttributeValue(*CurrentNode) + ","
          EndIf
        Wend
      EndIf
    ElseIf NodeName.s = "actors"
      If ExamineXMLAttributes(*CurrentNode)
        While NextXMLAttribute(*CurrentNode)
          AttributeName.s         = XMLAttributeName(*CurrentNode)
          If AttributeName.s      = "item"
            Movie\MovieActors + XMLAttributeValue(*CurrentNode) + ","
          EndIf
        Wend
      EndIf
    Else
      
      ; Debug 
      
    EndIf
    *ChildNode = ChildXMLNode(*CurrentNode)
    While *ChildNode <> 0
      ImportImdbDataFile_XML(*ChildNode, CurrentSublevel + 1)
      *ChildNode = NextXMLNode(*ChildNode)
    Wend
  EndIf
EndProcedure

Procedure ImportImdbDataFile()
  Protected.i XML
  Protected.q ImdbXMLFileSize.q
  Protected *Buffer, *Node
  ImdbXMLFile.i = ReadFile(#PB_Any, GetCurrentDirectory() + "Temporary\" + "ImdAPI.org.xml")
  If ImdbXMLFile.i
    ImdbXMLFileSize.q = Lof(ImdbXMLFile.i)
    If ImdbXMLFileSize.q
      *Buffer = AllocateMemory(ImdbXMLFileSize.q)
      If *Buffer
        If ReadData(ImdbXMLFile, *Buffer, ImdbXMLFileSize.q) = ImdbXMLFileSize.q
          XML = CatchXML(#PB_Any, *Buffer, ImdbXMLFileSize.q)
          If XML
            *Node = MainXMLNode(XML)
            If *Node
              ImportImdbDataFile_XML(*Node, 0)
            EndIf
            FreeXML(XML)
            Debug "Plot:      " + Movie\MoviePlot
            Debug "Category:  " + Movie\MovieCategory
            Debug "Title:     " + Movie\MovieTitle
            Debug "Directors: " + Movie\MovieDirectors
            Debug "Writers:   " + Movie\MovieWriters
            Debug "Actors;    " + Movie\MovieActors
          EndIf
        EndIf
        FreeMemory(*Buffer)
      EndIf
      CloseFile(ImdbXMLFile.i)
    EndIf
  EndIf
EndProcedure

ImportImdbDataFile()

Code: Select all

<IMDBDocumentList>
  <item>
    <rating>9.0</rating>
    <rating_count>673844</rating_count>
    <year>1994</year>
    <plot>Jules Winnfield and Vincent Vega are two hitmen who are out to retrieve a suitcas.</plot>
    <genres>
      <item>Crime</item>
      <item>Thriller</item>
    </genres>
    <rated>R</rated>
    <title>Pulp Fiction</title>
    <imdb_url>http://www.imdb.com/title/tt0110912/</imdb_url>
    <directors><item>Quentin Tarantino</item></directors>
    <writers>
      <item>Quentin Tarantino</item>
      <item>Roger Avary</item>
      <item>and 1 more credit</item>
    </writers>
    <actors>
      <item>John Travolta</item>
      <item>Samuel L. Jackson</item>
      <item>Tim Roth</item>
      <item>Amanda Plummer</item>
      <item>Eric Stoltz</item>
      <item>Bruce Willis</item>
      <item>Ving Rhames</item>
      <item>Phil LaMarr</item>
      <item>Maria de Medeiros</item>
      <item>Rosanna Arquette</item>
      <item>Peter Greene</item>
      <item>Uma Thurman</item>
      <item>Duane Whitaker</item>
      <item>Paul Calderon</item>
      <item>Frank Whaley</item>
    </actors>
    <plot_simple>The lives of two mob hit men, a boxer, a gangster'sion.</plot_simple>
    <type>M</type>
    <poster>http://ia.media-imdb.com/images/M/MV5BMjE0ODk2NjczOV5BMl5BanBnXkFtZTYwNDQ0NDg4._V1._SY317_CR4,0,214,317_.jpg</poster>
    <imdb_id>tt0110912</imdb_id>
    <also_known_as>
      <item>Tiempos violentos</item>
    </also_known_as>
    <language>
      <item>English</item>
      <item>Spanish</item>
      <item>French</item>
    </language>
    <country><item>USA</item></country>
    <release_date>19941014</release_date>
    <filming_locations>1525 N. Van Ness Avenue, Los Angeles, California, USA</filming_locations>
    <runtime>
      <item>154 min</item>
      <item>USA: 168 min (special edition)</item>
    </runtime>
  </item>
</IMDBDocumentList>
Amateur Radio/VK3HAF, (D-STAR/DMR and more), Arduino, ESP32, Coding, Crochet
El_Choni
TailBite Expert
TailBite Expert
Posts: 1007
Joined: Fri Apr 25, 2003 6:09 pm
Location: Spain

Re: XML decoding help needed again. Pointers and recursive s

Post by El_Choni »

Hi Fangs!

This seems to work here, although it's my first attempt with PB+XML so I'm not sure:

Code: Select all

    Structure MovieData
      MoviePlot.s
      MovieCategory.s
      MovieTitle.s
      MovieDirectors.s
      MovieWriters.s
      MovieActors.s
    EndStructure

    Global Movie.MovieData

    Declare   ImportImdbDataFile()
    Declare   ImportImdbDataFile_XML(*CurrentNode, CurrentSublevel.i)
    
    Procedure.s GetChildItems(*node)
      idx = 1
      *ChildNode = ChildXMLNode(*node, idx)
      res.s = ""
      c$ = ""
      While *ChildNode
        res+c$+GetXMLNodeText(*ChildNode)
        c$ = ", "
        idx+1
        *ChildNode = ChildXMLNode(*node, idx)
      Wend
      ProcedureReturn res
    EndProcedure
    
    Procedure ImportImdbDataFile_XML(*CurrentNode, CurrentSublevel.i)

      Protected NodeName.s, *ChildNode, AttributeName.s, FilenameString.s, PictureFileName.s, *Buffer
      Protected FileSize.i, PictureFileHandle.i, FileNamesCountLoop.i, FileNamePart.s
      Protected FileExtensionPart.s, Separator.s
     
      If XMLNodeType(*CurrentNode) = #PB_XML_Normal
        NodeName.s = GetXMLNodeName(*CurrentNode)
        Select NodeName.s
            Case "title":
              Movie\MovieTitle = GetXMLNodeText(*CurrentNode) + #LF$
              If Movie\MovieTitle <> ""
;                 Debug "Plot:      " + Movie\MoviePlot
;                 Debug "Category:  " + Movie\MovieCategory
;                 Debug "Title:     " + Movie\MovieTitle
;                 Debug "Directors: " + Movie\MovieDirectors
;                 Debug "Writers:   " + Movie\MovieWriters
;                 Debug "Actors;    " + Movie\MovieActors
              EndIf
            Case "plot":
              Movie\MoviePlot = GetXMLNodeText(*CurrentNode) + #LF$
            Case "genres":
              Movie\MovieCategory + GetChildItems(*CurrentNode)
            Case "directors":
              Movie\MovieDirectors + GetChildItems(*CurrentNode)
            Case "writers":
              Movie\MovieWriters + GetChildItems(*CurrentNode)
            Case "actors":
              Movie\MovieActors + GetChildItems(*CurrentNode)
            Default:
         
          ; Debug
         
        EndSelect
        *ChildNode = ChildXMLNode(*CurrentNode)
        While *ChildNode <> 0
          ImportImdbDataFile_XML(*ChildNode, CurrentSublevel + 1)
          *ChildNode = NextXMLNode(*ChildNode)
        Wend
      EndIf
    EndProcedure

    Procedure ImportImdbDataFile()
      Protected.i XML
      Protected.q ImdbXMLFileSize.q
      Protected *Buffer, *Node
      ImdbXMLFile.i = ReadFile(#PB_Any, "C:\Users\Miguel\Desktop\imdb.xml")
      If ImdbXMLFile.i
        ImdbXMLFileSize.q = Lof(ImdbXMLFile.i)
        If ImdbXMLFileSize.q
          *Buffer = AllocateMemory(ImdbXMLFileSize.q)
          If *Buffer
            If ReadData(ImdbXMLFile, *Buffer, ImdbXMLFileSize.q) = ImdbXMLFileSize.q
              XML = CatchXML(#PB_Any, *Buffer, ImdbXMLFileSize.q)
              If XML
                *Node = MainXMLNode(XML)
                If *Node
                  ImportImdbDataFile_XML(*Node, 0)
                EndIf
                FreeXML(XML)
                Debug "Plot:      " + Movie\MoviePlot
                Debug "Category:  " + Movie\MovieCategory
                Debug "Title:     " + Movie\MovieTitle
                Debug "Directors: " + Movie\MovieDirectors
                Debug "Writers:   " + Movie\MovieWriters
                Debug "Actors;    " + Movie\MovieActors
              EndIf
            EndIf
            FreeMemory(*Buffer)
          EndIf
          CloseFile(ImdbXMLFile.i)
        EndIf
      EndIf
    EndProcedure

    ImportImdbDataFile()
Is this what you were trying to get done?
El_Choni
User avatar
Fangbeast
PureBasic Protozoa
PureBasic Protozoa
Posts: 4789
Joined: Fri Apr 25, 2003 3:08 pm
Location: Not Sydney!!! (Bad water, no goats)

Re: XML decoding help needed again. Pointers and recursive s

Post by Fangbeast »

That's perfect El_Choni, thanks!

I need a long lesson about pointers and recursion, say around the next ten years:):)
Amateur Radio/VK3HAF, (D-STAR/DMR and more), Arduino, ESP32, Coding, Crochet
Post Reply