1

Тема: VBA: Декартовое произведение для xml

Добрый день. Может кто-нибудь видел реализацию по выводу xml файлов на лист экселя декартовым произведением?
т.е. подобный xml:


<?xml version="1.0" encoding="UTF-8"?>
<main>
    <sender>
	    <version>1.0</version>
	    <msg_date>26/12/2019</msg_date>
	    <position>director</position>
	    <fio>
	        <surname>Pupkin</surname>
	        <name>Ivan</name>
	        <patronymic>Ivanivich</patronymic>
	    </fio>
	</sender>
	<info>
		<org>
			<org_id>1234</org_id>
			<org_name>Organization</org_name>
		</org>
		<msg>
			<factor>777</factor>
			<op>
				<id>1</id>
				<sum>12345.67</sum>
				<doc>
					<doc_num>1</doc_num>
					<doc_date>11/05/2019</doc_date>
				</doc>
				<doc>
					<doc_num>2</doc_num>
					<doc_date>12/05/2019</doc_date>
				</doc>
				<doc>
					<doc_num>3</doc_num>
					<doc_date>13/05/2019</doc_date>
				</doc>
				<member>
					<id>1</id>
				    <fio>
				        <surname>Sidorov</surname>
				        <name>Andrey</name>
				        <patronymic>Ivanivich</patronymic>
				    </fio>
				</member>
				<member>
					<id>2</id>
				    <fio>
				        <surname>Petrov</surname>
				        <name>Pert</name>
				        <patronymic>Petrovich</patronymic>
				    </fio>
				</member>
			</op>
			<op>
				<id>2</id>
				<sum>1000</sum>
				<member>
					<id>1</id>
				    <fio>
				        <surname>Aaa</surname>
				        <patronymic>Ccc</patronymic>
				    </fio>
				</member>
				<member>
					<id>2</id>
				    <fio>
				        <surname>Ddd</surname>
				        <name>Eee</name>
				        <patronymic>Fff</patronymic>
				    </fio>
				</member>
			</op>
		</msg>
	</info>
</main>

как выбирая ноды из него через SelectNodes/SelectSingleNode вывести все строки "пересеченные" со всеми...

2 (изменено: Xameleon, 2020-07-10 22:53:28)

Re: VBA: Декартовое произведение для xml

Для начала Вы можете используя XPath выражение "//*[text()]" в методе SelectNodes, получить весь список тегов содержащих текст

Такой запрос вернёт Вам следующий набор:

+ открыть спойлер

<version>1.0</version>
<msg_date>26/12/2019</msg_date>
<position>director</position>
<surname>Pupkin</surname>
<name>Ivan</name>
<patronymic>Ivanivich</patronymic>
<org_id>1234</org_id>
<org_name>Organization</org_name>
<factor>777</factor>
<id>1</id>
<sum>12345.67</sum>
<doc_num>1</doc_num>
<doc_date>11/05/2019</doc_date>
<doc_num>2</doc_num>
<doc_date>12/05/2019</doc_date>
<doc_num>3</doc_num>
<doc_date>13/05/2019</doc_date>
<id>1</id>
<surname>Sidorov</surname>
<name>Andrey</name>
<patronymic>Ivanivich</patronymic>
<id>2</id>
<surname>Petrov</surname>
<name>Pert</name>
<patronymic>Petrovich</patronymic>
<id>2</id>
<sum>1000</sum>
<id>1</id>
<surname>Aaa</surname>
<patronymic>Ccc</patronymic>
<id>2</id>
<surname>Ddd</surname>
<name>Eee</name>
<patronymic>Fff</patronymic>

А дальше, используя перебор элементов через For Each или обычный For со счётчиком, перебрать элементы и произвести все операции произведения.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !