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.