Mit XMLStatus() Fehler in aktueller Datei finden?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

Mit XMLStatus() Fehler in aktueller Datei finden?

Beitrag von Phil »

Ich hab mal ein bisschen mit XML gespielt und mir ist aufgefallen, dass XMLStatus() meinen Fehler (Leerzeichen in Node-Name) nur beim neuen Laden der Datei findet. Das verstehe ich nicht, vielleicht kann mir jemand auf die Sprünge helfen.
Bearbeitet: OK, den Fehler habe ich: die XML Datei wurde nicht vorher geparsed und deshalb findet XMLStatus() nichts. Wie finde ich nun aber den Fehler am einfachsten schon beim Erstellen?
:shock:

Code: Alles auswählen

If Not CreateXML(0) : End : EndIf

*MainNode1 = CreateXMLNode(RootXMLNode(0)) ; Hauptknoten erstellen

SetXMLNodeName(*MainNode1,"DerName vonMainNode")
SetXMLNodeText(*MainNode1,"Der Text von MainNode")
SetXMLAttribute(*MainNode1,"Attributnr1", "Wert von Attribut nr1")

*Node1 = CreateXMLNode(*MainNode1,-1)

SetXMLNodeName(*Node1,"DerNamevonNode1")
SetXMLNodeText(*Node1,"Der Text von Node1")


*Node2 = CreateXMLNode(*MainNode1,-1)

SetXMLNodeName(*Node2,"DerNamevonNode2")
SetXMLNodeText(*Node2,"Der Text von Node2")


XMLStatus(0)
Debug "Fehler vor dem Speichern: " + XMLError(0)

SaveXML(0,"Test.xml")



LoadXML(1,"Test.xml")
If  XMLStatus(1)
  XMLStatus(1)
  Debug "Fehler beim Laden: " + XMLError(1)
  End
EndIf

PB 5.62 on Win10
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mit XMLStatus() Fehler in aktueller Datei finden?

Beitrag von Kiffi »

Phil hat geschrieben:Wie finde ich nun aber den Fehler am einfachsten schon beim Erstellen?
vielleicht ein wenig umständlich, aber so würde es funktionieren:

Code: Alles auswählen

Procedure.s CheckXml(XmlToTest.l)
  
  Protected DummyXml.l
  Protected XmlLen.l
  Protected MemBuffer.l
  Protected ReturnValue.s
  
  XmlLen = ExportXMLSize(XmlToTest)
  
  MemBuffer = AllocateMemory(XmlLen)
  
  ExportXML(XmlToTest, MemBuffer, XmlLen)
  
  DummyXml = CatchXML(#PB_Any, MemBuffer, XmlLen)
  
  FreeMemory(MemBuffer)
  
  XMLStatus(DummyXml)
  
  ReturnValue = XMLError(DummyXml)
  
  FreeXML(DummyXml)
  
  ProcedureReturn ReturnValue
  
EndProcedure

If Not CreateXML(0) : End : EndIf 

*MainNode1 = CreateXMLNode(RootXMLNode(0)) ; Hauptknoten erstellen 

SetXMLNodeName(*MainNode1,"DerName vonMainNode") 
SetXMLNodeText(*MainNode1,"Der Text von MainNode") 
SetXMLAttribute(*MainNode1,"Attributnr1", "Wert von Attribut nr1") 

*Node1 = CreateXMLNode(*MainNode1,-1) 

SetXMLNodeName(*Node1,"DerNamevonNode1") 
SetXMLNodeText(*Node1,"Der Text von Node1") 


*Node2 = CreateXMLNode(*MainNode1,-1) 

SetXMLNodeName(*Node2,"DerNamevonNode2") 
SetXMLNodeText(*Node2,"Der Text von Node2") 

Debug "Fehler vor dem Speichern: " + CheckXml(0)

SaveXML(0,"Test.xml") 

LoadXML(1,"Test.xml") 
If XMLStatus(1) 
  XMLStatus(1) 
  Debug "Fehler beim Laden: " + XMLError(1) 
  End 
EndIf
Grüße ... Kiffi
Hygge
Phil
Beiträge: 32
Registriert: 05.07.2006 10:46

Beitrag von Phil »

Danke für die Lösung :D. Ich finde es trotzdem etwas schade, dass man den XMLBaum erst als XMLDatei in den Speicher kopieren muss, um dann beim Zurückübersetzen in den XMLBaum diesen relativ einfachen Fehler zu finden.
Naja, mit einen schnellen PC kann man sich sowas erlauben. :wink:

Strukturelle (Verschachtelung etc. ) Fehler kann man mit den XML-Befehlen ja eigentlich kaum machen. Es wäre vielleicht sinnvoll, um solche Zeichenfehler zu vermeiden, wenn in den Befehlen zum Setzen von Knoten- und Attributnamen ein Rückgabewert auf einen Fehler hinweisen würde.

Bsp:
Ergebnis = SetXMLAttribute(*MainNode1,"Attribut Nr1", "Wert von Attribut nr1")
würde dann 0 zurückgeben, weil im Attributnamen ein Leerzeichen enthalten ist.
Was haltet ihr davon?
PB 5.62 on Win10
Gesperrt