powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите разобрать XML
8 сообщений из 8, страница 1 из 1
Помогите разобрать XML
    #39841392
balykovdron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача такая - есть 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
Помогите разобрать XML
    #39841556
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
Помогите разобрать XML
    #39841561
Забыл вставить сам селект

Код: 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
Помогите разобрать XML
    #39841871
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роман КудрявцевОчень сильно мешают 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
Помогите разобрать XML
    #39841903
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите разобрать XML
    #39841907
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приручаем неймспейсы.
Код: 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
Помогите разобрать XML
    #39842438
balykovdron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо огромное! Сам я такое не смог изобрести!
...
Рейтинг: 0 / 0
Помогите разобрать XML
    #39842451
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKadПриручаем неймспейсы.
У меня был случай на проекте, когда входной XML генерировали при каждом билде (там был список enum). При этом каждый раз был новый неймспейс (менялся номер версии в urn). При этом структура XML не менялась. Договориться с разработчиками не получилось, поэтому просто отрезал неймспейсы и работал с чем осталось.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите разобрать XML
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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