Объединить два XMLnodelist в VBA

У меня есть XMLnodelists, которые нужно объединить в один. Итак, я хотел бы скопировать содержимое oNodelist_B в oNodeList_A.

Set oNodeList_A = xmldoc.getElementsByTagName("A")
Set oNodeList_B = xmldoc.getElementsByTagName("B")

у кого-нибудь есть идея.?


person Menno    schedule 18.12.2015    source источник
comment
Какова конечная цель? Что вы хотите сделать с объединенным списком?   -  person Tim Williams    schedule 19.12.2015
comment
Привет Тим, Причина в том, что у меня есть инструмент, который мне нужно обновить. Этот инструмент анализирует данные, находящиеся в oNodeList_A (входными данными для этого списка является файл XML). Обновление того, что я хочу сделать, чтобы добавить разные данные в этот список из файла xm. Итак, помимо getElementByTagName («A») также («B’). Вот почему я думал заполнить два разных списка узлов, а затем объединить их в один. Может быть, у вас есть идея сделать это? Или другое решение?   -  person Menno    schedule 19.12.2015
comment
@TimWilliams см. комментарий выше   -  person Menno    schedule 20.12.2015
comment
Если вы используете xpath для выбора своих узлов, вы можете использовать оператор объединения | в своем выражении xpath.   -  person Tim Williams    schedule 20.12.2015
comment
@TimWilliams, Тим Большое спасибо за повтор. Я пытался использовать выражение xpath, но у меня проблемы с комбинацией. Код: Set oNodeList = xmlDoc.SelectNodes(//A) и Set oNodeList = xmlDoc.SelectNodes(//B) работают отдельно нормально. Но я не знаю, как совместить А и Б вместе. Потому что я пытался использовать | чар. Но в результате в списке узлов будут заполнены только узлы из A. Вот что я пробовал: Set oNodeList = xmlDoc.SelectNodes(//A|B)   -  person Menno    schedule 20.12.2015


Ответы (1)


Это работает для меня:

Sub Tester()
   Dim xmlDoc As New MSXML2.DOMDocument30
   Dim objNodes As IXMLDOMNodeList, o As IXMLDOMElement

  xmlDoc.async = False

  'xmlDoc.Load "D:\Analysis\config.xml"
  xmlDoc.LoadXML Range("A1").Value

  xmlDoc.setProperty "SelectionLanguage", "XPath" '<< required!

  If xmlDoc.parseError.errorCode <> 0 Then

    MsgBox "Error!" & vbCrLf & _
    "  Line: " & xmlDoc.parseError.Line & vbCrLf & _
    "  Text:" & xmlDoc.parseError.srcText & vbCrLf & _
    "  Reason: " & xmlDoc.parseError.reason

  Else

    Set objNodes = xmlDoc.SelectNodes("root/A|root/B")
    If objNodes.Length = 0 Then
      Debug.Print "not found"
    Else
      For Each o In objNodes
        Debug.Print o.tagName, o.nodeTypedValue
      Next o
    End If

  End If

End Sub

Тестовый XML:

<?xml version="1.0"?>
<root>
     <A>ValA1</A>
     <A>ValA2</A>
     <B>ValB1</B>
     <B>ValB2</B>
</root>
person Tim Williams    schedule 21.12.2015