在vb6中读取xml文件

时间:2010-10-06 08:01:42

标签: xml vb6

我知道在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对。我该怎么做呢?

请帮忙。

4 个答案:

答案 0 :(得分:25)

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

  • 创建MSXML2.DOMDocument
  • 的实例
  • 调用Load方法解析XML文件
  • 致电selectNodes("/Report/Categories/Category")。这将返回IXMLDOMNodeList对象。
  • 然后,您可以循环浏览通过IXMLDOMNodeitem检索每个nextNode的节点列表。
  • 然后,您可以使用XMLDOMNode的attributes属性或使用namevalue
  • 获取selectSingleNode("@name").TextselectSingleNode("@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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

谢谢,这些问题回答了我很多。花了我2天的时间来计算如何

select P.ProductName, count(*) as Ordered
    into #totalOrdered
    from Products as P
    join [Order Details] as OD on P.ProductID = OD.ProductID
    group by P.ProductName

    select C.CustomerID, P.ProductName, count(*) as Ordered
    into #CustomerOrders    
    from Customers as C
    join Orders as O on C.CustomerID = O.CustomerID
    join [Order Details] as OD on O.OrderID = OD.OrderID
    join Products as P on OD.ProductID = P.ProductID
    group by C.CustomerID, P.ProductName

select * 
From #CustomerOrders c
join #totalOrdered o on c.ProductName = o.ProductName