powered by simpleCommunicator - 2.0.34     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Распарсить xml как в sql
4 сообщений из 4, страница 1 из 1
Распарсить xml как в sql
    #39964756
Badhabit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
В 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
Распарсить xml как в sql
    #39965105
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно DOM парсеры поддерживают XPath
...
Рейтинг: 0 / 0
Распарсить xml как в sql
    #39965216
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Badhabit
Подскажите можно ли на алгоритмическом языке например на с/tinyxml, с#, java или например на powershell сделать так же? в смысле без кучи циклов и сохранений значений нод во временные переменные...)

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


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