Нужно объединить два файла xml с помощью Excel vba

Мне нужно объединить два файла XML в Excel VBA. 2-й XML-файл должен быть добавлен как родственный 1-му XML-файлу. Также необходимо создать Union после объединения файлов XML. Например:

1-й XML-файл:

<TupleList>
    <Member FullPath = "Latest : FOLDER Day Ending 06-16-2019"/>
</TupleList>

2-й XML-файл:

 <TupleList>
   <Member FullPath = "Latest : FOLDER Day Ending 06-17-2019"/>
 </TupleList>

Ожидаемый выходной XML-файл:

 <Union>
  <TupleList>
    <Member FullPath = "Latest : FOLDER Day Ending 06-16-2019"/>
  </TupleList>
  <TupleList>
   <Member FullPath = "Latest : FOLDER Day Ending 06-17-2019"/>
  </TupleList>
 </Union>

Я пробовал код ниже, но он не работает должным образом

  Set XOuter = CreateObject("MSXML2.DOMDocument")
  Set XOuter1 = CreateObject("MSXML2.DOMDocument")
  Dim appendNode As MSXML2.IXMLDOMNode
  XOuter.Load ("C:\\blp\\1stXML.xml")
  XOuter1.Load ("C:\\blp\\2ndXML.xml")
  For Each appendNode In XOuter1.DocumentElement.ChildNodes
     XOuter.DocumentElement.appendChild appendNode
  Next

Он обеспечивает вывод с Tuplelist в качестве родителя и 2 Members в качестве дочернего элемента. Но я хочу вывести в ожидаемом выше формате.

Действительный XML имеет один корневой элемент - это кажется проблемой для ожидаемого результата.

Tim Williams 22.07.2019 02:13

Понятно. Затем я могу создать тег Union перед списком кортежей. Обновлен ожидаемый результат

Arvinth 22.07.2019 02:18
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
2
1 308
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Dim inDoc As New MSXML2.DOMDocument60
Dim resultDoc As New MSXML2.DOMDocument60
Dim rt As Object, nd

Set rt = resultDoc.appendChild(resultDoc.createElement("Union"))

Debug.Print resultDoc.XML

''using loadXML here for convenience...
inDoc.LoadXML ("<TupleList><Member FullPath = ""Latest : FOLDER Day Ending 06-16-2019""/></TupleList>")
Set nd = resultDoc.importNode(inDoc.DocumentElement, True)
rt.appendChild nd

inDoc.LoadXML ("<TupleList><Member FullPath = ""Latest : FOLDER Day Ending 06-17-2019""/></TupleList>")
Set nd = resultDoc.importNode(inDoc.DocumentElement, True)
rt.appendChild nd

Debug.Print resultDoc.XML
Ответ принят как подходящий

Если у вас много файлов, вы можете поместить их в папку, а затем использовать cmd, чтобы объединить их в один файл (при условии, что у них нет корневых узлов). Затем используйте fileSystemObject, чтобы добавить корневой узел. Я решил работать с существующим документом, хотя думал об использовании .appendChild и .createElement для добавления корневого узла с дополнительной переменной документа. Думаю, я мог бы на самом деле предпочесть это.

Option Explicit

Public Sub CombineFiles()
    Dim cmd As String, fso As Object, xmlDoc As Object, numberOfFilesInFolder As Long, folder As Object
    Const FOLDER_PATH As String = "C:\Users\User\Desktop\XML Test"
    Const COMBINED_FILE_PATH As String = "C:\Users\User\Desktop\XML Test\Combined.xml"

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(FOLDER_PATH)

    numberOfFilesInFolder = folder.Files.Count
    cmd = "cmd /c cd """ & folder & """ && copy *.xml Combined.xml"

    Shell cmd, vbNormalFocus

    Do
        DoEvents
    Loop Until folder.Files.Count = numberOfFilesInFolder + 1

    AddRootNode COMBINED_FILE_PATH, fso
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")

    With xmlDoc
        .validateOnParse = True
        .setProperty "SelectionLanguage", "XPath"
        .async = False
        If Not .Load(COMBINED_FILE_PATH) Then
            Err.Raise .parseError.ErrorCode, , .parseError.reason
            Exit Sub
        End If
    End With
End Sub
Public Sub AddRootNode(ByVal filepath As String, fso As Object)
    Const READING = 1
    Const WRITING = 2
    Dim file As Object, contents As String

    Set file = fso.OpenTextFile(filepath, READING)

    contents = file.ReadAll
    file.Close
    contents = "<Union>" & vbCrLf & Replace$(contents, Chr$(26), vbNullString) & vbCrLf & "</Union>"
    Set file = fso.OpenTextFile(filepath, WRITING, True)
    file.Write contents
    file.Close
End Sub

Использованная литература:

  1. https://www.tek-tips.com/viewthread.cfm?qid=1421842
  2. https://en.wikipedia.org/wiki/Substitute_character
  3. Объединение нескольких xml-документов в один большой с помощью пакетного файла @Бхаскар
  4. Создайте xml rootNode через С#

@YasserKhalil попробуйте добавить короткую задержку раньше.

QHarr 22.07.2019 17:38

у вас есть пустые строки внизу файлов? Или пустые файлы? docs.microsoft.com/en-us/office/vba/language/reference/…

QHarr 22.07.2019 17:42

Итак, два файла с разными xml в каждом? И в нужную папку?

QHarr 22.07.2019 17:52

Неа. Попробуйте пройти через F8

QHarr 22.07.2019 18:02

Итак, вопрос времени. Вы поставили паузу перед добавлением корневого узла?

QHarr 22.07.2019 18:08

Большое спасибо. Теперь решено, и я пытался несколько раз. `Application.Wait Now + TimeValue("00:00:03") AddRootNode COMBINED_FILE_PATH, fso `

YasserKhalil 22.07.2019 18:11

Другие вопросы по теме