web-dev-qa-db-ja.com

VB6でXMLファイルを読み取る

私はvb.netでxmlファイルを読む方が簡単だと知っていますが、私たちのアプリケーションはまだvb6にあるので、回避策が必要です。しかし、どういうわけか、私は立ち往生しています。また、別のアプリケーションから生成されているため、xmlファイルを制御できません。 xmlファイルの短いコードを以下に示します。

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

XMLファイルがこのような形式であれば、簡単に読み取ることができただろう。

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

しかし、生成されたxmlファイルは私の制御下にないので、私は今数時間以来、これで立ち往生しています。

このxmlファイルからNAME-VALUEペアを読み取る必要があります。これをどうやってやるの?

助けてください。

18
Ubaid

[〜#〜] msxml [〜#〜] を使用すると、.NET XML APIの一部と同様の機能を提供できます。現在、VB6のコピーはありませんが、とても簡単です。まず、VB6プロジェクトから [〜#〜] msxml [〜#〜] への参照を追加します。次に、次のようなことを行います。

  • MSXML2.DOMDocument のインスタンスを作成します
  • Load メソッドを呼び出して、XMLファイルを解析します。
  • selectNodes("/Report/Categories/Category")を呼び出します。 IXMLDOMNodeList オブジェクトを返します。
  • 次に、ノードリストをループして、各 IXMLDOMNodeitem または nextNode を取得します。
  • 次に、XMLDOMNodeの name プロパティを使用するか、selectSingleNode("@name").TextおよびselectSingleNode("@value").Text

MSXMLはかなり柔軟であるため、使用できる構文はさらに短くなりますが、上記の方法でうまくいくはずです。まだ理解していない場合は、VB6がインストールされたマシンに到達したときにコードを投稿します。

UDPATE:

以下は、提供したXMLサンプルを使用した実用的な例です。

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

この質問(およびArdmanによってリンクされた記事)でアドバイスされているように、 [〜#〜] msxml [〜#〜] を使用します。

IXMLDOMElement.getAttributeNode を使用して属性を読み取ることができます。

たとえば、次のコードは、MSDNから sample books.xmlファイル を読み取り、属性にアクセスします。 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
2
MarkJ

ありがとう、この質問の答えは私を助けてくれました。方法を理解するのに2日かかった

Set xmlDoc = CreateObject("Msxml2.DOMDocument")

Dim nodeBook
Dim nodeId
xmlDoc.async = False
xmlDoc.Load ("xmlfile url")
If (xmlDoc.parseError.errorCode <> 0) Then
   Dim myErr
   Set myErr = xmlDoc.parseError
   MsgBox ("You have error " & myErr.reason)
Else
   Set nodeBook = xmlDoc.selectSingleNode("//Program")
   Set nodeId = nodeBook.getAttributeNode("description")
   wscript.Echo nodeId.value
End If
0
Lovsan

xSLTを使用して、XMLをこの構造から値のペアに変換できます

http://www.xmlfiles.com/articles/sample_chapters/sams_xmlforaspnet/default.asp

0
Iain