Ich schreibe gerade einen minimalen Packer (für eigene Zwecke... hab nicht vor, daraus etwas großes zu machen) und weil "scriptability" und "ease-of-use" dachte ich mir "Ich bin jetzt ganz schlau, und bau mir 'ne XML-Unterstützung". Nun sitz ich seit einer Stunde hier, halte mich nicht mehr für ganz so schlau, und überlege, ob es nicht einen einfacheren Weg gibt, eine Struktur-Instanz mit XML-Werten zu befüllen. (Eine einfachere Variante gibt's bestimmt, nur hab' ich wieder ein riesen Brett vorm Kopp)
Hier eine Beispiel-XML-Datei:
Code: Alles auswählen
<?xml version="1.0" encoding="utf-8" ?>
<archive>
<name>package.pkg</name>
<compression-level>9</compression-level>
<files basedir="C:\Temp">
<file name="Program.exe" />
<file name="Text.txt" />
<file name="img\image.bmp" />
</files>
</archive>
Code: Alles auswählen
Structure Package
Name.s
CompressionLevel.i
BaseDir.s
List Files.s()
EndStructure
Procedure ProcessXML( ID, *Package.Package )
Protected *ParentNode = MainXMLNode( ID )
Protected *CurrentNode = *ParentNode
If XMLNodeType( *ParentNode ) = #PB_XML_Normal
*ChildNode = ChildXMLNode( *CurrentNode )
While *ChildNode <> 0
Protected Name.s = LCase( GetXMLNodeName(*ChildNode) )
Select Name
Case "name"
*Package\Name = GetXMLNodeText( *ChildNode )
Case "compression-level"
*Package\CompressionLevel = Val( GetXMLNodeText(*ChildNode) )
Case "files"
If ExamineXMLAttributes( *ChildNode ) And NextXMLAttribute( *ChildNode )
If LCase( XMLAttributeName(*ChildNode) ) = "basedir"
*Package\BaseDir = XMLAttributeValue( *ChildNode )
EndIf
EndIf
*ChildNode2 = ChildXMLNode( *ChildNode )
While *ChildNode2 <> 0
Protected Name2.s = LCase( GetXMLNodeName(*ChildNode2) )
If ExamineXMLAttributes( *ChildNode2 ) And NextXMLAttribute( *ChildNode2 )
If LCase( XMLAttributeName(*ChildNode2) ) = "name"
AddElement(*Package\Files())
*Package\Files() = XMLAttributeValue( *ChildNode2 )
EndIf
EndIf
*ChildNode2 = NextXMLNode(*ChildNode2)
Wend
EndSelect
*ChildNode = NextXMLNode(*ChildNode)
Wend
EndIf
EndProcedure
Gruß, Mok.