Code archives/File Utilities/XmlToMax

This code has been declared by its author to be Public Domain code.

Download source code

XmlToMax by Otus2008
LibXml required!

Converts an XML file to object tree of user defined types and the other way around using LibXml and Reflection.

To load an XML file, all you need to do is extend all supported object types from TNode. The names of XML elements and attributes are matched with types and fields.

To save an XML file, you also need to tag fields that you want to save with {xml}. Example in first post should be self explanatory.
SuperStrict

Import BRL.Reflection

Import BaH.LibXml

Type TNode Abstract
	
	Method AddChild(n:TNode) Abstract
	
	Method GetChildren:TList() Abstract
	
	Global typeid:TTypeId = TTypeId.ForName("TNode")
	
End Type

Function XmlToMax:TNode(x:TxmlNode)
	Local t:TTypeId = TTypeId.ForName(x.GetName())
	If Not t Return Null
	
	Local n:TNode = TNode(t.NewObject())
	If Not n Return Null
	
	'Convers attributes to fields
	Local l:TList = x.GetAttributeList()
	If l
		For Local a:TxmlAttribute = EachIn l
			Local f:TField = t.FindField(a.GetName())
			If f Then f.Set n, a.GetValue()
		Next
	End If
	
	'Convert child elements
	l = x.GetChildren()
	If l
		For Local c:TxmlNode = EachIn l
			n.AddChild XmlToMax(c)
		Next
	End If
	
	Return n
End Function

Function MaxToXml:TxmlNode(n:TNode, parent:TxmlNode = Null)
	Local t:TTypeId = TTypeId.ForObject(n)
	
	Local x:TxmlNode
	If parent
		x = parent.AddChild(t.Name())
	Else
		x = TxmlNode.newNode(t.Name())
	End If
	
	'Convert fields to attributes
	For Local f:TField = EachIn t.EnumFields()
		If f.MetaData("xml") Then x.AddAttribute f.Name(), String(f.get(n))
	Next
	
	'Convert child nodes
	For Local c:TNode = EachIn n.GetChildren()
		MaxToXml c, x
	Next
	
	Return x
End Function

Comments

Otus2008
Example:


Produced XML:



Hezkore2012
Wow, this is pretty neat.
Wish I had found this earlier!


Code Archives Forum