在 vb6 中读取 xml 文件

Posted

技术标签:

【中文标题】在 vb6 中读取 xml 文件【英文标题】:reading xml files in vb6 【发布时间】:2010-10-06 08:01:41 【问题描述】:

我知道在 vb.net 中读取 xml 文件更容易,但由于我们的 appl 仍在 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 对。我该怎么做?

请帮忙。

【问题讨论】:

【参考方案1】:

您可以使用MSXML 来完成此操作,它提供与某些 .NET XML API 类似的功能。我现在没有 VB6 的副本,但这很容易。首先,从您的 VB6 项目中添加对 MSXML 的引用。然后,您将执行以下操作:

创建MSXML2.DOMDocument 的实例 调用Load方法解析XML文件 致电selectNodes("/Report/Categories/Category")。这将返回一个 IXMLDOMNodeList 对象。 然后您可以遍历节点列表,通过item 或nextNode 检索每个IXMLDOMNode。 然后您可以使用 XMLDOMNode 的 attributes 属性或使用 selectSingleNode("@name").TextselectSingleNode("@value").Text 获取 namevalue

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

【讨论】:

【参考方案2】:

按照此问题(以及 Ardman 链接的文章)中的建议使用 MSXML。

您可以使用IXMLDOMElement.getAttributeNode 来读取属性。

例如,下面的代码从 MSDN 读取 sample books.xml file 并访问一个属性。您需要对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

【讨论】:

【参考方案3】:

您可以使用 XSLT 将 XML 从这种结构转换为值对

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

【讨论】:

【参考方案4】:

谢谢,这个问题的答案对我帮助很大。我花了 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

【讨论】:

如果您在发布代码作为答案时至少能解释一下您的代码会更好。 对不起,我的错,我从 url 获取 xml 文件并从中存储一些数据以供以后使用,我在访问 这样的值时遇到问题> 但能够获取刚刚存储在 value 中的数据,这是我所缺少的关键“getAttributeNode("")"

以上是关于在 vb6 中读取 xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

读取大文本文件VB6中的行数

使用vb6通过MSFlexigrid将XML数据导入SQL表

250分最高分,请高手解答VB6程序读取网页文本及其链接的方法

从 VB6 读取 python shell 行

在VB中如何读取到桌面的路径?

VB6.0中如何实现逐行读入文本文件?