Seite 1 von 1

Alle XML-Knoten auslesen...

Verfasst: 03.02.2013 11:42
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?

Re: Alle XML-Knoten auslesen...

Verfasst: 03.02.2013 13:09
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

Re: Alle XML-Knoten auslesen...

Verfasst: 03.02.2013 14:15
von Kiffi
hatten wir letztens erst: http://www.purebasic.fr/german/viewtopi ... 21#p307221

Grüße ... Kiffi