Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите разобрать XML / 8 сообщений из 8, страница 1 из 1
25.07.2019, 13:59
    #39841392
balykovdron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобрать XML
Задача такая - есть XML. У него нужно найти дочерний элемент для MessagePrimaryContent. Дочерний может быть разным, поэтому привязываться к его названию нельзя. Он там один единственный всегда. И У этого элемента достать имя корневого узла и его namespace.

В нижеизложенном примере ответом должно быть 2 колонки где имя корневого элемента CnsiRequest и его namespace - urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0

Найти дочерний элемент для MessagePrimaryContent у меня получается - а вот вытащить данные из него нет. Мало опыта в Оракле - помогите, братцы.

Код: plsql
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.
with t as (
	select XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
    <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Body>
            <SendRequestRequest xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1">
                <SenderProvidedRequestData Id="SIGNED_BY_CALLER">
                    <MessageID>b995ce79-70c2-11e9-8c2b-10eab366176b</MessageID>
                    <MessagePrimaryContent
                            xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.1">
                        <tns:CnsiRequest xmlns:tns="urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0">
                            <tns:ListClassifiers>
                                <tns:ClassifierDescriptorList>true</tns:ClassifierDescriptorList>
                            </tns:ListClassifiers>
                        </tns:CnsiRequest>
                    </MessagePrimaryContent>
                </SenderProvidedRequestData>
            </SendRequestRequest>
        </Body>
    </Envelope>') as xml
	from dual
),
mpc as
	(
		select extract(t.xml, '//*[local-name() = ''MessagePrimaryContent'']/*[1]') as child -- тут прекрасно находится узел tns:CnsiRequest
	    from t
	)
select extract(mpc.child, '//local_name()') as ns -- имя и namespace не могу подобрать
from mpc
...
Рейтинг: 0 / 0
25.07.2019, 17:48
    #39841556
Помогите разобрать XML
balykovdron,

Очень сильно мешают NS при работе с XML в Оракле. Поэтому первым делом я удаляю их. Написал вот такую функцию
Код: plsql
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.
FUNCTION remove_namespaces(p_xml IN xmltype) RETURN xmltype IS
  l_xml xmltype;
BEGIN
  ----------------------------------------------------------------
  SELECT XMLTRANSFORM(p_xml,
                      Xmltype('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">' ||
                              '  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>' ||
                              '  <xsl:template match="*">' ||
                              '    <xsl:element name="{local-name()}">' ||
                              '      <xsl:apply-templates select="node()|@*" />' ||
                              '    </xsl:element>' ||
                              '  </xsl:template>' ||
                              '  <xsl:template match="@*">' ||
                              '    <xsl:attribute name="{local-name()}">' ||
                              '      <xsl:value-of select="."/>' ||
                              '    </xsl:attribute>' ||
                              '  </xsl:template>' ||
                              '  <xsl:template match="processing-instruction()|comment()">' ||
                              '    <xsl:copy>' ||
                              '      <xsl:apply-templates select="node()"/>' ||
                              '    </xsl:copy>' ||
                              '  </xsl:template>' ||
                              '</xsl:stylesheet>'))
    INTO l_xml
    FROM dual;
  ----------------------------------------------------------------
  ----------------------------------------------------------------
  RETURN l_xml;
  ----------------------------------------------------------------
END remove_namespaces;



Вот что у меня получилось для вашего примера

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select XXCUST_XML_PKG.remove_namespaces(XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
    <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Body>
            <SendRequestRequest xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1">
                <SenderProvidedRequestData Id="SIGNED_BY_CALLER">
                    <MessageID>b995ce79-70c2-11e9-8c2b-10eab366176b</MessageID>
                    <MessagePrimaryContent
                            xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.1">
                        <tns:CnsiRequest xmlns:tns="urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0">
                            <tns:ListClassifiers>
                                <tns:ClassifierDescriptorList>true</tns:ClassifierDescriptorList>
                            </tns:ListClassifiers>
                        </tns:CnsiRequest>
                    </MessagePrimaryContent>
                </SenderProvidedRequestData>
            </SendRequestRequest>
        </Body>
    </Envelope>')) from dual



Вернул CnsiRequest
...
Рейтинг: 0 / 0
25.07.2019, 17:59
    #39841561
Помогите разобрать XML
Забыл вставить сам селект

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select * from XMLTABLE('//MessagePrimaryContent/*' PASSING XXCUST_XML_PKG.remove_namespaces(XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
    <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Body>
            <SendRequestRequest xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1">
                <SenderProvidedRequestData Id="SIGNED_BY_CALLER">
                    <MessageID>b995ce79-70c2-11e9-8c2b-10eab366176b</MessageID>
                    <MessagePrimaryContent
                            xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.1">
                        <tns:CnsiRequest xmlns:tns="urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0">
                            <tns:ListClassifiers>
                                <tns:ClassifierDescriptorList>true</tns:ClassifierDescriptorList>
                            </tns:ListClassifiers>
                        </tns:CnsiRequest>
                    </MessagePrimaryContent>
                </SenderProvidedRequestData>
            </SendRequestRequest>
        </Body>
    </Envelope>'))
                      COLUMNS child_el_name varchar2(255) PATH 'name(.)'
                              )  
...
Рейтинг: 0 / 0
26.07.2019, 13:23
    #39841871
rpovarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобрать XML
Роман КудрявцевОчень сильно мешают NS при работе с XML в Оракле. Поэтому первым делом я удаляю их. Написал вот такую функцию
...

То же самое, но без функции. Это не моё, кого-то из местных аксакалов, но не смог найти кого именно :)

Код: 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.
36.
37.
38.
SELECT * FROM
  XMLTABLE('//MessagePrimaryContent/*' 
  PASSING 
    xmltransform(xmltype('<?xml version="1.0" encoding="utf-8"?>
                          <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                                    xmlns="http://schemas.xmlsoap.org/soap/envelope/">
                              <Body>
                                  <SendRequestRequest xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1">
                                      <SenderProvidedRequestData Id="SIGNED_BY_CALLER">
                                          <MessageID>b995ce79-70c2-11e9-8c2b-10eab366176b</MessageID>
                                          <MessagePrimaryContent
                                                  xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.1">
                                              <tns:CnsiRequest xmlns:tns="urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0">
                                                  <tns:ListClassifiers>
                                                      <tns:ClassifierDescriptorList>true</tns:ClassifierDescriptorList>
                                                  </tns:ListClassifiers>
                                              </tns:CnsiRequest>
                                          </MessagePrimaryContent>
                                      </SenderProvidedRequestData>
                                  </SendRequestRequest>
                              </Body>
                          </Envelope>'
    ), XMLPARSE(DOCUMENT '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
                            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
                            <xsl:template match="@*|node()">  
                              <xsl:copy>  
                                <xsl:apply-templates select="@*|node()"/>  
                             </xsl:copy>  
                           </xsl:template>  
                           <xsl:template match="*">  
                             <xsl:element name="{local-name(.)}">  
                               <xsl:apply-templates select="@*|node()"/>  
                             </xsl:element>  
                           </xsl:template>  
                           <xsl:template match="@xsi:schemaLocation"/>  
                         </xsl:stylesheet>'
    ))
  COLUMNS child_el_name VARCHAR2(255)PATH 'name(.)');
...
Рейтинг: 0 / 0
26.07.2019, 14:06
    #39841903
SeaGate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобрать XML
balykovdronВ нижеизложенном примере ответом должно быть 2 колонки где имя корневого элемента CnsiRequest и его namespace - urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0

Код: plsql
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.
SQL> with t as (
  2    select Xmltype('<?xml version="1.0" encoding="utf-8"?>
  3      <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  4                xmlns="http://schemas.xmlsoap.org/soap/envelope/">
  5          <Body>
  6              <SendRequestRequest xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1">
  7                  <SenderProvidedRequestData Id="SIGNED_BY_CALLER">
  8                      <MessageID>b995ce79-70c2-11e9-8c2b-10eab366176b</MessageID>
  9                      <MessagePrimaryContent
 10                              xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.1">
 11                          <tns:CnsiRequest xmlns:tns="urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0">
 12                              <tns:ListClassifiers>
 13                                  <tns:ClassifierDescriptorList>true</tns:ClassifierDescriptorList>
 14                              </tns:ListClassifiers>
 15                          </tns:CnsiRequest>
 16                      </MessagePrimaryContent>
 17                  </SenderProvidedRequestData>
 18              </SendRequestRequest>
 19          </Body>
 20      </Envelope>'
 21    ) as xml
 22      from dual
 23  )
 24  select xmlcast(xmlquery('node()/local-name()' passing x returning content) as varchar2(30)) element_name,
 25         xmlcast(xmlquery('node()/namespace-uri()' passing x returning content) as varchar2(128)) ns
 26    from (select xmlquery(q'!//*[local-name() = 'MessagePrimaryContent']/*[1]!' passing xml returning content) x
 27            from t);

ELEMENT_NAME NS
------------ ----------------------------------------------------------------------
CnsiRequest  urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0
...
Рейтинг: 0 / 0
26.07.2019, 14:12
    #39841907
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобрать XML
Приручаем неймспейсы.
Код: plsql
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.
column name format a30
column uri  format a70

with t as (
    select XMLTYPE('<?xml version="1.0" encoding="utf-8"?>
    <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Body>
            <SendRequestRequest xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1">
                <SenderProvidedRequestData Id="SIGNED_BY_CALLER">
                    <MessageID>b995ce79-70c2-11e9-8c2b-10eab366176b</MessageID>
                    <MessagePrimaryContent
                            xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.1">
                        <tns:CnsiRequest xmlns:tns="urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0">
                            <tns:ListClassifiers>
                                <tns:ClassifierDescriptorList>true</tns:ClassifierDescriptorList>
                            </tns:ListClassifiers>
                        </tns:CnsiRequest>
                    </MessagePrimaryContent>
                </SenderProvidedRequestData>
            </SendRequestRequest>
        </Body>
    </Envelope>') as xml from dual)
select name, uri
from t, 
xmltable(
xmlnamespaces(
  'http://www.w3.org/2001/XMLSchema-instance' as "xsi",
  'http://www.w3.org/2001/XMLSchema' as "xsd",
  'urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.1' as "srr",
  'urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.1' as "srb",
  default 'http://schemas.xmlsoap.org/soap/envelope/'
),
'/Envelope/Body/srr:SendRequestRequest/srr:SenderProvidedRequestData/srb:MessagePrimaryContent'
passing t.xml
columns
name varchar2(100 byte) path 'node()/local-name()',
uri  varchar2(100 byte) path 'node()/namespace-uri()'
);

NAME                           URI
------------------------------ ----------------------------------------------------------------------
CnsiRequest                    urn://x-artefacts-smev-gov-ru/esnsi/smev-integration/read/2.0.0
...
Рейтинг: 0 / 0
29.07.2019, 10:50
    #39842438
balykovdron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобрать XML
Спасибо огромное! Сам я такое не смог изобрести!
...
Рейтинг: 0 / 0
29.07.2019, 11:16
    #39842451
rpovarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобрать XML
AmKadПриручаем неймспейсы.
У меня был случай на проекте, когда входной XML генерировали при каждом билде (там был список enum). При этом каждый раз был новый неймспейс (менялся номер версии в urn). При этом структура XML не менялась. Договориться с разработчиками не получилось, поэтому просто отрезал неймспейсы и работал с чем осталось.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите разобрать XML / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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