Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разбор XML / 3 сообщений из 3, страница 1 из 1
23.03.2020, 11:40
    #39940214
ArkadyL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Здравствуйте!

Подскажите, пожалуйста, как разобрать простой XML
В таком виде после некоторых упрощений всё в порядке
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT ((xpath('idList/text()', x))[1])::varchar(20)::integer AS idList
FROM (
SELECT 
     unnest(xpath('//Envelope/Body/GetDNListResponse/DNListItem', xml)) AS x
      FROM (      
SELECT '<?xml version="1.0" encoding="Windows-1251"?>
   <Envelope>
	<Body>
	   <GetDNListResponse>
		  <DNListItem>
  			<idList>26998489</idList>
	           </DNListItem>
	           <DNListCount>78299</DNListCount>
            </GetDNListResponse>
      </Body>
</Envelope>'::xml as xml) xxx
) yyy;



А вот исходный XML не разбирается
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0" encoding="Windows-1251"?>
   <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope">
	<s:Body>
	  <GetDNListResponse xmlns="http://NGate.org/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
	     <DNListItem>
		  <idList>26998489</idList>
             </DNListItem>
             <DNListCount>78299</DNListCount>
</GetDNListResponse>
</s:Body>
</s:Envelope>



Как бы записать строчку в xpath, чтобы она понимала пространства имён?
...
Рейтинг: 0 / 0
23.03.2020, 14:13
    #39940263
ArkadyL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор XML
Так тоже не получается
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT ((xpath('idList/text()', x))[1])::varchar(20)::integer AS idList
FROM (
SELECT 
     unnest(xpath('//s:Envelope/s:Body/GetDNListResponse/DNListItem', xml, ARRAY[ARRAY['s', 'http://schemas.xmlsoap.org/soap/envelope']])) AS x
      FROM (      
SELECT '<?xml version="1.0" encoding="Windows-1251"?>
   <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope">
	<s:Body>
		<GetDNListResponse xmlns="http://NGate.org/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 			<DNListItem>
	         		<idList>26998489</idList>
                        </DNListItem>
			<DNListCount>78299</DNListCount>
                </GetDNListResponse>
         </s:Body>
</s:Envelope>'::xml as xml) x
) yyy;
...
Рейтинг: 0 / 0
24.03.2020, 21:32
    #39940786
Jackvoron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбор 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.
39.
40.
41.
42.
43.
44.
45.
46.
SELECT
	(
		(
			xpath(
				'myns:idList/text()'
				,raw_xml
				,ARRAY[
					 ARRAY['myns', 'http://NGate.org/']
				]
				
			)
		)[1]
	)::varchar(20)::integer AS idList
FROM
	(	
		SELECT 
			unnest(
				xpath(
					'//s:Envelope/s:Body/myns:GetDNListResponse/myns:DNListItem'
					,raw_xml
					,ARRAY[
						   ARRAY['s', 'http://schemas.xmlsoap.org/soap/envelope']
						--,ARRAY['i', 'http://www.w3.org/2001/XMLSchema-instance']
						--регистрируем свое пространтво имен так как имеем вот это - GetDNListResponse xmlns="http://NGate.org/"
						 ,ARRAY['myns', 'http://NGate.org/']
					]
				)
			) AS raw_xml

		FROM 
			(      
				SELECT 
					$_$<?xml version="1.0" encoding="Windows-1251"?>
					<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope">
						<s:Body>
							<GetDNListResponse xmlns="http://NGate.org/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
								<DNListItem>
									<idList>26998489</idList>
								</DNListItem>
								<DNListCount>78299</DNListCount>
							</GetDNListResponse>
						</s:Body>
					</s:Envelope>
					$_$::xml as raw_xml
			) AS xxx
	) AS raw_data



В данном XML документе присутствует пространство имен по умолчанию xmlns=" http://NGate.org/" , мы его должны определить
и использовать в xpath выражении

Вот тут написано примерно как https://docs.microsoft.com/ru-ru/dotnet/standard/data/xml/xpath-queries-and-namespaces
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разбор XML / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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