Alle XML-Knoten auslesen...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Alle XML-Knoten auslesen...

Beitrag von Sunny »

Ich habe das problem, das ich mir jetzt schon ne ganze Weile gedanken darüber mache wie ich es schaffe, alle Knoten aus einer XML Datei zu lesen und es einfach nicht hinbekomme.
Mein Code dazu sieht z.Z. so aus.

Code: Alles auswählen

Procedure GetXMLChild(*Node)
  Debug GetXMLNodeName(*Node)
  
  If ChildXMLNode(*Node) > 0
    *Node = ChildXMLNode(*Node)
    GetXMLChild(*Node)
  ElseIf NextXMLNode(*Node) > 0
    *Node = NextXMLNode(*Node)
    GetXMLChild(*Node)
  ElseIf ParentXMLNode(*Node) > 0
    *Node = ParentXMLNode(*Node)
    
    If NextXMLNode(*Node) > 0
      *Node = NextXMLNode(*Node)
      GetXMLChild(*Node)
    EndIf
  EndIf
EndProcedure

Procedure GetXMLHirarchie(XMLFile.s)
  Protected.i *Node, i
  
  If LoadXML(0, XMLFile)
    *Node = MainXMLNode(0)
        GetXMLChild(*Node)

  EndIf
EndProcedure

File$ = "Pfad zur XML-Datei"

GetXMLHirarchie(File$)

damit versuche ich alle Knoten aus einer XML-Datei mit folgendem Aufbau auszulesen:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<noi:DOCUMENT>
	<noi:VERSION/>
	
	<noi:MODEL_SECTION>
		<noi:BASIS_VOLUME3D>
			<noi:UUID/>
			<noi:NAMED_UUID/>
			
			<noi:GEOMETRY>
				<noi:GEO_PACKED_POLYHEDRON3D>
					<noi:GEO_POINT_LIST_3D>
						<noi:POINTS>Inhalt</noi:POINTS>
					</noi:GEO_POINT_LIST_3D>
					
					<noi:GEO_EDGE_LIST>
						<noi:EDGES>Inhalt</noi:EDGES>
					</noi:GEO_EDGE_LIST>
					
					<noi:GEO_FACE_LIST>
						<noi:FACES>Inhalt</noi:FACES>
					</noi:GEO_FACE_LIST>
					
				</noi:GEO_PACKED_POLYHEDRON3D>
			</noi:GEOMETRY>
			
			<noi:COMMON_STYLE/>
			
		</noi:BASIS_VOLUME3D>
	</noi:MODEL_SECTION>
	
</noi:DOCUMENT>
allerdings wird in diesem Beispiel der Knoten "noi:COMMON_STYLE" ausgelassen.

Also wie bekomme ich es hin, dass ich alle Knoten einer XML-Datei auslesen kann?
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Alle XML-Knoten auslesen...

Beitrag von helpy »

Hi Sunny,

In Deinem Code gibt es ein Problem. Das liegt an Deinen If-Abfragen! Da werden unter bestimmten Umständen Knoten ignoriert.

Es ist sinnvoller, wenn Du in einer Schleife Knoten einer Ebene abarbeitest und dann die Routine rekursiv für die Kindknoten aufrufst.

Wie wäre es damit:

Code: Alles auswählen

Procedure ParseAllXMLNodes(*Node, Level = 0)
	Protected *childNode
	
	*childNode = ChildXMLNode(*Node)
	While *childNode
		Debug Space(Level * 4) + GetXMLNodeName(*childNode)
		If ChildXMLNode(*childNode) 
			ParseAllXMLNodes(*childNode, Level+1)
		EndIf
		*childNode = NextXMLNode(*childNode)
	Wend
EndProcedure

Procedure GetXMLHirarchie(XMLFile.s)
	Protected.i *Node, i
	
	If LoadXML(0, XMLFile)
		*Node = RootXMLNode(0)
		ParseAllXMLNodes(*Node)
		
	EndIf
EndProcedure

File$ = "Pfad zur XML-Datei"
GetXMLHirarchie(File$)
lg,
guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Alle XML-Knoten auslesen...

Beitrag von Kiffi »

hatten wir letztens erst: http://www.purebasic.fr/german/viewtopi ... 21#p307221

Grüße ... Kiffi
a²+b²=mc²
Antworten