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.