Разобрать образец XML в массиве VBA - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь проанализировать XML с VBA. XML имеет следующую структуру:

<?xml version="1.0" encoding="utf-8"?>
 <T>
   <P>
      <D> 
         <A> something 1<A> 
         <A> something 2<A>
      <D>
   <P>
   <P>
      <E>                     
         <B> something 3<B> 
         <B> something 4<B>
      <E>
   <P>
<T>
`

Я пытаюсь написать фрагмент кода, который зацикливается во втором узле P, чтобы получить значение B в массиве [что-то 3, что-то 4],Если у вас есть немного кода, который «выравнивает» XML в массиве, это также интересно.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Для достижения своей цели вы можете использовать Microsoft XML library. Вот Sub, который делает то, что вам нужно:

Sub getNodesValues()
    Dim xmlDoc As New DOMDocument30 'Need Reference "Microsoft Xml, 3.0"
    xmlDoc.Load ("C:\Users\myusername\Desktop\test.xml") 'Set your file name
    xmlDoc.async = False

    Dim nodeList As IXMLDOMNodeList
    Dim mainNode As IXMLDOMNode

    Dim arr() As String 'Array that will store results
    Dim index As Long: index = 1

    'This uses xPath to access an element
    Set nodeList = xmlDoc.SelectNodes("//P/E/B") 
    ReDim arr(1 To nodeList.Length)

    'For each node in List
    For Each mainNode In nodeList
        arr(index) = mainNode.Text 'Store value in array

        'Show node name and value in immediate console
        Debug.Print mainNode.nodeName & ":" & mainNode.Text

        index = index + 1
    Next mainNode

    'Do what you have to do with your array
    '[..]
End Sub

Важные замечания

Вы загружаете свой файл через эту строку:

xmlDoc.Load ("C:\Users\myusername\Desktop\test.xml") 'Set your file name

И с этимВ строке вы указываете библиотеке, что искать в файле .xml:

Set nodeList = xmlDoc.SelectNodes("//P/E/B") 

В этом примере мы ищем тег P в любой позиции, который содержит тег E, которыйсодержит тег B. Вы можете изменить это на что угодно.

Надеюсь, это поможет.

0 голосов
/ 10 октября 2019

Usse xml linq:

Imports System.Xml
Imports System.Xml.Linq
Module Module1

    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim doc As XDocument = XDocument.Load(FILENAME)

        Dim xP As List(Of XElement) = doc.Descendants("P").ToList()

        Dim results = xP.Elements().SelectMany(Function(x) x.Elements().Select(Function(y) New With {
                                                                                   .parent = x.Name.LocalName, _
                                                                                   .child = y.Name.LocalName, _
                                                                                   .text = CType(y, String)
                                                                               })).ToList()
    End Sub

End Module
...