Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Распарсить xml как в sql / 4 сообщений из 4, страница 1 из 1
31.05.2020, 17:46
    #39964756
Badhabit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить xml как в sql
Добрый день!
В mssql server для разбора подобного .xml-файла:
Код: 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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
<?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>
                <doc>
                    <doc_num>1</doc_num>
                    <doc_date>11/06/2019</doc_date>
                </doc>
                <doc>
                    <doc_num>2</doc_num>
                    <doc_date>12/06/2019</doc_date>
                </doc>
                <doc>
                    <doc_num>3</doc_num>
                    <doc_date>13/06/2019</doc_date>
                </doc>
                <member>
                    <id>1</id>
                    <fio>
                        <surname>Aaa</surname>
                        <name>Bbb</name>
                        <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>


пишу что-то типа такого:
Код: sql
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.
declare @sCmd nvarchar(max), @sFullPath varchar(max), @x xml

set @sFullPath = 'd:\test.xml'
set @sCmd = N'select @xml = cast(t.data as xml) from OPENROWSET (BULK '+quotename(@sFullPath, N'''') + N', SINGLE_BLOB) t(data)'
exec sp_executesql @sCmd, N'@xml xml output', @x output;

select distinct
    sender.n.value('version[1]', 'varchar(10)') 'sender.version'
    , sender.n.value('msg_date[1]', 'varchar(50)') 'sender.msg_date'
    , sender.n.value('position[1]', 'varchar(40)') 'sender.position'
    , sender.n.value('fio[1]/surname[1]', 'varchar(500)') 'sender.fio.surname'
    , sender.n.value('fio[1]/name[1]', 'varchar(500)') 'sender.fio.name'
    , sender.n.value('fio[1]/patronymic[1]', 'varchar(500)') 'sender.fio.patronymic'

    , info.n.value('org[1]/org_id[1]', 'varchar(100)') 'info.org.org_id'
    , info.n.value('org[1]/org_name[1]', 'varchar(100)') 'info.org.org_name'

    , info.n.value('msg[1]/factor[1]', 'varchar(10)') 'info.msg.factor'

    , info_msg_op.n.value('id[1]', 'varchar(32)') 'info.msg.op.id'
    , info_msg_op.n.value('sum[1]', 'varchar(32)') 'info.msg.op.sum'

    , info_msg_op_doc.n.value('doc_num[1]', 'varchar(32)') 'info.msg.op.doc.doc_num'
    , info_msg_op_doc.n.value('doc_date[1]', 'varchar(32)') 'info.msg.op.doc.doc_date'

    , info_msg_op_member.n.value('id[1]', 'varchar(32)') 'info.msg.op.member.id'
    , info_msg_op_member.n.value('fio[1]/surname[1]', 'varchar(32)') 'info.msg.op_member.fio.surname'
    , info_msg_op_member.n.value('fio[1]/name[1]', 'varchar(32)') 'info.msg.op.member.fio.name'
    , info_msg_op_member.n.value('fio[1]/patronymic[1]', 'varchar(32)') 'info.msg.op.member.fio.patronymic'
from @x.nodes('main') as main(n)
outer apply main.n.nodes('sender') as sender(n) 
outer apply main.n.nodes('info') as info(n)
    outer apply info.n.nodes('msg/op') as info_msg_op(n)
        outer apply info_msg_op.n.nodes('doc') as info_msg_op_doc(n)
        outer apply info_msg_op.n.nodes('member') as info_msg_op_member(n)


и получаю избыточную одномерную табличку (избыточная потому, что у меня в каждом op три doc и два member итого 6 строк для каждой op) но мне собственно так и нужно...
Подскажите можно ли на алгоритмическом языке например на с/tinyxml, с#, java или например на powershell сделать так же? в смысле без кучи циклов и сохранений значений нод во временные переменные...)
...
Рейтинг: 0 / 0
01.06.2020, 18:08
    #39965105
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить xml как в sql
Обычно DOM парсеры поддерживают XPath
...
Рейтинг: 0 / 0
02.06.2020, 05:59
    #39965216
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить xml как в sql
Badhabit
Подскажите можно ли на алгоритмическом языке например на с/tinyxml, с#, java или например на powershell сделать так же? в смысле без кучи циклов и сохранений значений нод во временные переменные...)

XML Bulk Load
...
Рейтинг: 0 / 0
03.06.2020, 01:23
    #39965486
Badhabit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распарсить xml как в sql
_Vasilisk_,
ну xpath то понятно, я просто интересуюсь есть ли простой способ сделать на любом алгоритмическом языке "автоматом" cross apply (ну или джоин) средствами импорта xml, чтобы кучу циклов не писать...
Или от этого не уйти?
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Распарсить xml как в sql / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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