Überprüfen ob XML Node existiert und ggf. Node erstellen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Sebert
Beiträge: 19
Registriert: 21.03.2014 19:12

Überprüfen ob XML Node existiert und ggf. Node erstellen

Beitrag von Sebert »

Hallo zusammen,

bin recht neuer Purebasicuser, komme eigentlich ehr so aus der VBA Richtung.

Ich habe Fragen was den Umgang, bzw. die praktische Umsetzung von Funktionen im Zusammenhang
mit XML stehen.

Hintergrund: Ich bastle an einem Podcatcher, um Podcasts runterzuladen, zu taggen etc.
Das Auslesen von Rss/Atomfeeds stellt mich bisher nicht vor Probleme. Ich möchte vielmehr
alle runtergeladenen Podcasts mit Url und GUID in eine XML-History speichern.
Das sieht dann so aus, bzw. soll mal so aussehen

Code: Alles auswählen

<history>
<feed feedID = "http://evers.podspot.de/rss">
  <downloadedUrl>http://evers.podspot.de/files/277_Cottbus.MP3</downloadedUrl>
  <downloadedGuid>3d1d010af1e0557c32b63236e01ac8e7</downloadedGuid>
</feed>
<feed feedID = "http://www1.swr.de/podcast/xml/swr1/bw/leute.xml">
</feed>
</history>
Nehmen wir an mein Programm nimmt sich jetzt den Feed http://podcast.hr-online.de/hr2_wissenswert/podcast.xml vor.
Wie wäre das cleverste vorgehen um zu überprüfen ob ein feed mit dieser feedID bereits besteht?
Wenn nein => Erstellen => url & GUID reinschreiben
Wenn ja => url & GUID reinschreiben

DIe Überprüfung ob url & GUID schon drinstehen versschiebe ich mal auf später !

Grüße

Sebastian
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Überprüfen ob XML Node existiert und ggf. Node erstellen

Beitrag von Andesdaf »

ist nicht getestet, sollte deine erste Frage aber beantworten:

Code: Alles auswählen

EnableExplicit

Enumeration 
  #XML_HISTORY
EndEnumeration

Structure tFeedInfo
  sFeedID.s
  Map FeedItems.s()
EndStructure

Define NewList llFeeds.tFeedInfo()
Define *Node, *Node2, *Node3, *Node4
Define iFound.i

; Feedliste llFeeds muss zuvor gefüllt werden.
; FeedItems-Map:
; MapKey = MapElement
; GUID   = URL

If LoadXML(#XML_HISTORY, "History.xml") And XMLStatus(#XML_HISTORY) = #PB_XML_Success
  ForEach llFeeds()
    *Node = MainXMLNode(#XML_HISTORY)
    *Node2 = ChildXMLNode(*Node)                                    ; erstes <feed>
    If *Node2
      iFound = 0
      Repeat                                                        ; alle Knoten im XML-Baum durchsehen
        If llFeeds()\sFeedID = GetXMLAttribute(*Node2, "feedID")    ; feedID bereits in der History enthalten
          iFound = 1
          Break
        EndIf
        
        *Node2 = NextXMLNode(*Node2)
      Until *Node2 = 0
        
      If iFound = 1
        *Node3 = *Node2                                             ; Elternknoten für URL und GUID ist gefundener Knoten
      Else
        *Node3 = CreateXMLNode(*Node, -1)                           ; Elternknoten für URL und GUID ist neuer Knoten
        SetXMLNodeName(*Node3, "feed")
        SetXMLAttribute(*Node3, "feedID", llFeeds()\sFeedID)
      EndIf
      
      ForEach llFeeds()\FeedItems()
        *Node4 = CreateXMLNode(*Node3, -1)
        SetXMLNodeName(*Node4, "downloadedURL")
        SetXMLNodeText(*Node4, llFeeds()\FeedItems())
        
        *Node4 = CreateXMLNode(*Node3, -1)
        SetXMLNodeName(*Node4, "downloadedGUID")
        SetXMLNodeText(*Node4, MapKey(llFeeds()\FeedItems()))
      Next
    Else
      Break         
    EndIf
  Next
  SaveXML(#XML_HISTORY, "History.xml")
  FreeXML(#XML_HISTORY)
EndIf
Ich nehme mal an, dass ein Feed mehrere downloadedURL und dowloadedGUID-Elemente haben kann.
Dann würde ich auf jeden Fall je einen URL- und einen GUID-Knoten in einen übergeordneten Knoten
packen, damit deutlich wird, welche GUID zu welcher URL gehört:

Code: Alles auswählen

<history>
<feed feedID = "http://evers.podspot.de/rss">
  <download>
    <downloadedUrl>http://evers.podspot.de/files/277_Cottbus.MP3</downloadedUrl>
    <downloadedGuid>3d1d010af1e0557c32b63236e01ac8e7</downloadedGuid>
  </download>
  <download>
    ...
  </download>
</feed>
<feed feedID = "http://www1.swr.de/podcast/xml/swr1/bw/leute.xml">
</feed>
</history>
so lässt sich dann auch leichter prüfen, ob GUID und URL schon existieren.
Win11 x64 | PB 6.20
Benutzeravatar
Sebert
Beiträge: 19
Registriert: 21.03.2014 19:12

Re: Überprüfen ob XML Node existiert und ggf. Node erstellen

Beitrag von Sebert »

Hi Andesdaf,

danke für die Antwort, den Code und den Vorschlag bzgl. der Struktur.

Werde das alles testen, und dir dann Feedback geben.

Schönes Wochenende !

Grüße

Sebastian
Benutzeravatar
Sebert
Beiträge: 19
Registriert: 21.03.2014 19:12

Re: Überprüfen ob XML Node existiert und ggf. Node erstellen

Beitrag von Sebert »

Hi Andesaf,

wollte mich nochmal bedanken, hat alles super geklappt.

Habe das ganze in zwei Prozeduren aufgesplittet:
Eine checkt nur ob die jeweilige Episode bereits in der history steht, eine die diese dann einträgt, bzw. den entsprechenden Feedknoten bei Bedarf erstellt.

Und habe nach etwas Recherche rausgefunden, dass bei Podcasts GUID und Url sehr oft identisch sind,
brauche also nur die URL, insofern ist mein Dateiformat jetzt recht simpel.

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>

<history>
  <feed feedID="http://evers.podspot.de/rss">
    <downloadedURL>
      http://evers.podspot.de/files/277_Cottbus.MP3
    </downloadedURL>
    <downloadedURL>
    .....
    </downloadedURL>
  </feed>
</history>
Vielen Dank für deine Hilfe

Grüße

Sebastian
Antworten