2010-10-06 38 views
17

Wiem, że łatwiej jest czytać pliki xml w vb.net, ale ponieważ nasz appl jest nadal na vb6, potrzebuję obejść. ale jakoś utknąłem. również nie mam kontroli nad plikiem xml, ponieważ jest on generowany z innej aplikacji. Krótki kod z pliku XML jest poniżejczytanie plików xml w 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> 

Jeśli plik XML byłby w takim formacie jak ten, byłbym w stanie go łatwo odczytać.

<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> 

Ale ponieważ wygenerowany plik XML nie jest w mojej gestii, utknąłem w tym miejscu od kilku godzin.

Muszę odczytać pary NAZWA-WARTOŚĆ z tego pliku xml. jak sobie z tym poradzę?

proszę o pomoc.

Odpowiedz

24

Można to zrobić z MSXML, który oferuje podobną funkcjonalność jak niektóre .NET API XML. Nie mam teraz kopii VB6, ale to całkiem proste. Najpierw dodaj odniesienie do MSXML od ciebie projektu VB6. Można by wtedy zrobić coś jak następuje:

  • Utwórz instancję MSXML2.DOMDocument
  • wywołać metodę Load do analizowania pliku XML
  • Wywołać selectNodes("/Report/Categories/Category"). Spowoduje to zwrócenie obiektu IXMLDOMNodeList.
  • Następnie można przechodzić przez listę węzłów, pobierając poszczególne IXMLDOMNode przez item lub nextNode.
  • Można wówczas uzyskać name i value pomocą własność XMLDOMNode attributes lub za pomocą selectSingleNode("@name").Text i selectSingleNode("@value").Text

MSXML jest dość elastyczna, więc nie jest jeszcze krótsza składnia, które można wykorzystać, ale powyżej powinny działać dla ciebie. Jeśli jeszcze tego nie zauważyłeś, opublikuję kod, gdy dojdę do maszyny z zainstalowanym VB6.

UDPATE:

Oto przykład pracy przy użyciu próbki XML, który podałeś.

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

użytkowania MSXML zgodnie z zaleceniami w tej kwestii (oraz w artykule połączonych Ardman).

Możesz użyć IXMLDOMElement.getAttributeNode, aby odczytać atrybuty.

Na przykład ten kod poniżej odczytuje sample books.xml file z MSDN i uzyskuje dostęp do atrybutu. Potrzebujesz odniesienia do 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