2010-10-06 12 views
17

Je sais qu'il est plus facile de lire les fichiers xml dans vb.net mais comme notre appl est toujours sur vb6, j'ai besoin d'un peu de travail. mais de toute façon, je suis coincé. aussi je n'ai pas de contrôle sur le fichier xml car il est généré à partir d'une autre application. code court à partir du fichier xml est ci-dessous,lire des fichiers xml en vb6

<Report> 
      <Categories> 
        <Category name="CASHMAN" value="Cash Management" /> 
        <Category name="IM" value="Inventory Management" /> 
        <Category name="POS" value="Point of Sale" /> 
        <Category name="PRODUCT" value="Product" /> 
      </Categories> 
    </Report> 

Si le fichier XML aurait été dans un format comme celui-ci, je l'aurais pu le lire facilement.

<Report> 
      <Categories> 
        <name>CASHMAN</name> 
        <value>Cash Management</value> 
      </Categories> 
      <Categories> 
        <name>IM</name> 
        <value>Inventory Management</value> 
      </Categories> 
      <Categories> 
        <name>POS</name> 
        <value>Point of Sale</value> 
      </Categories> 
      <Categories> 
        <name>PRODUCT</name> 
        <value>Product</value> 
      <Categories> 
    <Report> 

Mais comme le fichier XML généré n'est pas sous mon contrôle, je suis bloqué depuis quelques heures maintenant.

J'ai besoin de lire les paires NAME-VALUE de ce fichier xml. comment vais-je avec ça?

aidez s'il vous plaît.

Répondre

24

Vous pouvez le faire avec MSXML, qui offre des fonctionnalités similaires que certaines des API XML .NET. Je n'ai pas de copie de VB6 pour le moment, mais c'est assez facile. Tout d'abord, ajoutez une référence à MSXML de votre projet VB6. Vous pouvez ensuite faire quelque chose comme ce qui suit:

  • Créer une instance de MSXML2.DOMDocument
  • Appelez la méthode Load pour analyser le fichier XML
  • Appelez le selectNodes("/Report/Categories/Category"). Cela retournera un objet IXMLDOMNodeList.
  • Vous pouvez ensuite parcourir la liste des nœuds en récupérant chaque IXMLDOMNode via item ou nextNode.
  • Vous pouvez alors obtenir le name et value en utilisant la propriété attributes du XMLDOMNode ou en utilisant selectSingleNode("@name").Text et selectSingleNode("@value").Text

MSXML est assez souple, donc il y a une syntaxe encore plus courte que vous pouvez utiliser, mais devrait-dessus travailler pour toi. Si vous ne l'avez pas encore compris, je vais poster le code quand j'arriverai à une machine avec VB6 installé.

UDPATE:

Voici un exemple de travail en utilisant l'exemple XML que vous avez fourni.

Sub ParseXmlDocument() 
    Dim doc As New MSXML2.DOMDocument 
    Dim success As Boolean 

    success = doc.Load(App.Path & "\test.xml") 
    If success = False Then 
     MsgBox doc.parseError.reason 
    Else 
     Dim nodeList As MSXML2.IXMLDOMNodeList 

     Set nodeList = doc.selectNodes("/Report/Categories/Category") 

     If Not nodeList Is Nothing Then 
     Dim node As MSXML2.IXMLDOMNode 
     Dim name As String 
     Dim value As String 

     For Each node In nodeList 
      ' Could also do node.attributes.getNamedItem("name").text 
      name = node.selectSingleNode("@name").Text 
      value = node.selectSingleNode("@value").Text 
     Next node 
     End If 
    End If 
End Sub 
2

Utilisez MSXML comme indiqué dans cette question (et dans l'article lié par Ardman).

Vous pouvez utiliser IXMLDOMElement.getAttributeNode pour lire les attributs.

Par exemple, ce code lit le sample books.xml file à partir de MSDN et accède à un attribut. Vous avez besoin d'une référence à a version of Microsoft XML.

Private Sub Form_Load() 
Dim xmlDoc As New MSXML2.DOMDocument30 
Dim nodeBook As IXMLDOMElement 
Dim nodeId As IXMLDOMAttribute 
Dim sIdValue As String 
xmlDoc.async = False 
xmlDoc.Load App.Path & "\books.xml" 
If (xmlDoc.parseError.errorCode <> 0) Then 
    Dim myErr 
    Set myErr = xmlDoc.parseError 
    MsgBox ("You have error " & myErr.reason) 
Else 
    Set nodeBook = xmlDoc.selectSingleNode("//book") 
    Set nodeId = nodeBook.getAttributeNode("id") 
    sIdValue = nodeId.xml 
    MsgBox sIdValue 
End If 

End Sub 
Questions connexes