powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Экспорт в XML. Рекурсия
2 сообщений из 2, страница 1 из 1
Экспорт в XML. Рекурсия
    #39201425
Hells87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоит задача. Получить на выходе XML файл вида:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="windows-1251"?>
<list_clients>
<id_merch>123</id_merch>
<client_info rest="e" info="w" ident="q">
	<client_info rest="d" info="s" ident="a">
		<client_info rest="c" info="x" ident="z"/>
	</client_info>
</client_info>
</list_clients>



В Excel написал скрипт:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
Const strFilePath As String = "C:\TestXML1.xml"

Sub ExtportToXML()
Dim objDoc As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMNode
Dim objRoot As MSXML2.IXMLDOMElement
Dim objElem As MSXML2.IXMLDOMElement
Dim objElem1 As MSXML2.IXMLDOMElement
Dim objElem2 As MSXML2.IXMLDOMElement

Dim ar As Variant
Dim i As Integer

        Set objDoc = New DOMDocument
        objDoc.resolveExternals = True
        Set objNode = objDoc.createProcessingInstruction("xml", "version='1.0' encoding='windows-1251'")
        Set objNode = objDoc.InsertBefore(objNode, objDoc.ChildNodes.Item(0))
        Set objRoot = objDoc.createElement("list_clients")
        Set objDoc.DocumentElement = objRoot
        Set objNode = objDoc.createElement("id_merch")

        objNode.Text = 123
        objRoot.appendChild objNode
        
        i = 1
            '-----------------------------------------------------'
                Set objElem = objDoc.createElement("client_info")
                objElem.setAttribute "rest", Cells(i, 3)

                objElem.setAttribute "info", Cells(i, 2)

                objElem.setAttribute "ident", Cells(i, 1)
                objRoot.appendChild objElem
                i = i + 1
            '-----------------------------------------------------'
                Set objElem1 = objDoc.createElement("client_info")
                objElem1.setAttribute "rest", Cells(i, 3)

                objElem1.setAttribute "info", Cells(i, 2)

                objElem1.setAttribute "ident", Cells(i, 1)
                objElem.appendChild objElem1
                i = i + 1
            '-----------------------------------------------------'
                Set objElem2 = objDoc.createElement("client_info")
                objElem2.setAttribute "rest", Cells(i, 3)

                objElem2.setAttribute "info", Cells(i, 2)

                objElem2.setAttribute "ident", Cells(i, 1)
                objElem1.appendChild objElem2
            '-----------------------------------------------------'
        objDoc.Save strFilePath
End Sub



Проблема заключается во вложении элементов "client_info", потому что количество их заранее не известно.
Как написать рекурсию, чтобы каждый раз не объявлять objElem (MSXML2.IXMLDOMElement)?
Файл Excel прилагаю. В Module2 моя попытка реализовать рекурсию, но там вылазит ошибка.
...
Рейтинг: 0 / 0
Экспорт в XML. Рекурсия
    #39201466
Hells87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача решена:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Const strFilePath As String = "C:\TestXML1.xml"
Public objDoc As MSXML2.DOMDocument
Public objNode As MSXML2.IXMLDOMNode
Public objRoot As MSXML2.IXMLDOMElement


Sub ExtportToXML()
    Dim ar As Variant
    Dim i As Integer
        
        Set objDoc = New DOMDocument
        objDoc.resolveExternals = True
        Set objNode = objDoc.createProcessingInstruction("xml", "version='1.0' encoding='windows-1251'")
        Set objNode = objDoc.InsertBefore(objNode, objDoc.ChildNodes.Item(0))
        Set objRoot = objDoc.createElement("list_clients")
        Set objDoc.DocumentElement = objRoot
        Set objNode = objDoc.createElement("id_merch")
        objNode.Text = 123
        objRoot.appendChild objNode
        i = 1
            
            AddElement objDoc, objRoot, i
            
        objDoc.Save strFilePath
End Sub


Function AddElement(xmlDom As MSXML2.DOMDocument, objElem As MSXML2.IXMLDOMElement, i As Integer)
    Dim objElem0 As MSXML2.IXMLDOMElement
        Do
                Set objElem0 = xmlDom.createElement("client_info")
                objElem0.setAttribute "rest", Cells(i, 3)
                objElem0.setAttribute "info", Cells(i, 2)
                objElem0.setAttribute "ident", Cells(i, 1)
                objElem.appendChild objElem0
                i = i + 1

                If Cells(i, 1) <> "" Then AddElement xmlDom, objElem0, i
        Loop Until Cells(i, 1) = ""
End Function

...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Экспорт в XML. Рекурсия
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]