XML-Gemurkse
Verfasst: 23.09.2012 16:48
				
				Hallo zusammen!
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:
Hier mein Gemurks:
Wenn man nun annimmt, einen HTML-Parser in PB zu schreiben... gar nicht erst dran denken!
Gruß, Mok.
			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.