Как получить конкретную информацию из документа типа XML - PullRequest
0 голосов
/ 13 февраля 2019

Я работаю над макросом VBA в Excel, чтобы собрать информацию из программного кода ЧПУ.На данный момент я получил тип материала, толщину, размеры по 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>

Есть много строк «Информация».Может быть больше одной строки 'Tool', но я только после чего-либо из строки с '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

Но этот тип кода не получает сокращенную длину.

Любая помощь, пожалуйста?:)

Спасибо

Саймон

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы можете использовать 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

Результат:

enter image description here

0 голосов
/ 13 февраля 2019

Толщина сохраняется как элемент XML в вашем примере.Длина хранится в виде атрибута XML.(см. https://www.xmlfiles.com/xml/xml-attributes/)

Чтобы прочитать атрибут XML, просмотрите: Считать атрибут XML VBA

Основываясь на представленном там коде, вы должны быть в состоянии решитьВаша проблема с:

'Include a reference to Microsoft XML v3
Dim XMLDataDrg As DOMDocument30
Set XMLDataDrg = New DOMDocument30
XMLDataDrg.Load ("C:\...\sample.xml")

'...

Dim id As String
id = XMLDataDrg.SelectSingleNode("//Info/MC/Tool").Attributes.getNamedItem("length").Text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...