【问题标题】:reading xml files in vb6在 vb6 中读取 xml 文件
【发布时间】: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 对。我该怎么做?

请帮忙。

【问题讨论】:

    标签: xml vb6


    【解决方案1】:

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

    • 创建MSXML2.DOMDocument 的实例
    • 调用Load方法解析XML文件
    • 致电selectNodes("/Report/Categories/Category")。这将返回一个 IXMLDOMNodeList 对象。
    • 然后您可以遍历节点列表,通过itemnextNode 检索每个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("")"
          猜你喜欢
          • 1970-01-01
          • 2014-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-17
          • 1970-01-01
          • 2015-11-06
          相关资源
          最近更新 更多