martedì 3 febbraio 2015

XML PARSER - VB6


Vi è mai capitato di dover leggere un file XML in VB6? NO? a me si, vediamo insieme cosa fare per leggere questo formato dal buon vecchio linguaggio VB6.



Ancora Visual Basic 6?!?

Linguaggio di programmazione in disuso in quasi tutti gli scenari informatici moderni, Microsoft Visual Basic 6.0 risulta essere ancora il fondamento della maggior parte di applicazioni per l'automazione industriale. Il formato XML, nonostante adesso venga quasi del tutto sostituito con formati "più leggeri" come il JSON, è un altro componente molto frequente del mio settore.


Microsoft XML

La libreria che dobbiamo utilizzare per leggere un file XML (per fortuna) è già contenuta nel sistema operativo in uso, per referenziarla sarà sufficiente cercare la voce "Microsoft XML V3.0" (msxml3.dll).


DOM, alberi e figli.

Partiamo dal concetto che ogni file XML viene trattato in un oggetto di tipo DOM (Document Object Model) che ripropone al programmatore la struttura logica di un albero (nodi e figli) per l'esplorazione di un file XML. Supponiamo di avere il file "C:\file.xml" con il seguente contenuto:
<root>
   <a>
      <words>
         <word value="auto"/>
         <word value="apple"/>
         <word value="anchor"/>
      </words>
   </a>
   <b/>
   <c/>
   <d name="D" ascii="68" hex="44"/>
</root>

Se volessimo conoscere l'elenco dei nodi figli del nodo radice il nostro codice sarà il seguente:
Dim DOM as new DOMDocument
Dim nodes as IXMLDOMNodeList
Dim node as IXMLDOMNode
DOM.load "C:\file.xml"
Set nodes = DOM.selectNodes("//root")
Set nodes = nodes(1).childNodes
For Each node in nodeList
   'do something with them
Next

Ogni volta che si accede al nodo, possiamo utilizzare la ricorsione per accedere di nuovo ai figli del nodo figlio.
[...]
For Each node in nodeList
   if node.nodeName = "a" then
      Dim wordsNode as IXMLDOMNode
      Dim wordNode as IXMLDOMNode
      set wordsNode = node.childNodes(1)
      For Each wordNode in wordsNode.childNodes
         'do something with them
      Next
   end if
Next

Per ogni nodo a cui abbiamo accesso, possiamo anche esplorare gli attributi:
[...]
For Each node in nodeList
   if node.nodeName = "d" then
      Dim a as IXMLDOMAttribute
      For Each a in node.attributes
         'do something with them
      Next
   end if
Next

Conclusione

Certo sarebbe meglio avere strutture più flessibili che offrono la ricerca implicitamente nella chiamata del metodo, ma la versione che vi ho mostrato è quella compatibile al 100% con le applicazioni del settore industriale e del Visual Basic Script che espongono i vari ambienti di sviluppo SCADA. Fatemi sapere se siete interessati alle nuove versioni della libreria Microsoft XML per Visual Basic 6.

Nessun commento:

Posta un commento