首页 > 解决方案 > 如何从 XML 类型文档中检索特定信息

问题描述

我正在使用 Excel 中的 VBA 宏来从 CNC 程序代码中收集信息。到目前为止,我已经获得了材料类型、厚度、x 和 Y 尺寸以及使用的数量。

我现在正在尝试获得“切割长度” - 所以我可以在成本计算中使用它。

这是 XML 代码段:

<Info num="6" name="Tools">
      <MC machine="psys_ETN_5">
        <Tool name="TN901" length="16262.96209" time="53.72817301" cutoutArea="8138.657052"/>
      </MC>
    </Info>

有很多“信息”行。可能有不止一个“工具”系列,但我只追求“TN901”系列中的任何东西。

我试图捕获的数据是 'Length="######.##"' 的值

我已经从这样的代码中捕获了我需要的所有其他内容:

<Material>316</Material>
      <SheetX>2000</SheetX>
      <SheetY>1000</SheetY>
      <Thickness>3</Thickness>
</Material>

使用这样的代码:

    For Each nodemat In XMLDataDrg.SelectNodes("//Material")
        Matl = nodemat.Text
        Worksheets("Sheet4").Range("H" & RowA).Value = Matl
    Next
    For Each nodesht In XMLDataDrg.SelectNodes("//Thickness")
        Thk = nodesht.Text
        Worksheets("Sheet4").Range("I" & RowA).Value = Thk
    Next

但是那种类型的代码没有得到切割长度。

请问有什么帮助吗?:)

谢谢

西蒙

标签: excelxmlvbanodes

解决方案


您可以使用 xpath 限制Tool属性name具有值的元素,TN901然后循环所有属性并写出。我正在从桌面上的文件中读取您的 XML。

Option Explicit
Public Sub test()
    Dim xmlDoc As Object
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    With xmlDoc
        .validateOnParse = True
        .setProperty "SelectionLanguage", "XPath"
        .async = False

        If Not .Load("C:\Users\User\Desktop\Test.xml") Then
            Err.Raise .parseError.ErrorCode, , .parseError.reason
        End If
    End With
    Dim elem As Object, attrib As Object

    For Each elem In xmlDoc.SelectNodes("//Tool[@name='TN901']")
       For Each attrib In elem.Attributes
           Debug.Print attrib.nodeName, attrib.Text
       Next
    Next
End Sub

结果:

在此处输入图像描述


推荐阅读