Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите как правильно разобрать xml  [new]
Vinil
Member

Откуда:
Сообщений: 28
Доброго всем дня!
Подскажите как разобрать такой вид xml файла
<ItemUPCRef xmlns="http://www.oracle.com/retail/integration/base/bo/ItemUPCRef/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:ItemRef xmlns:ns1="http://www.oracle.com/retail/integration/base/bo/ItemRef/v1">
<ns1:item>8713807007005</ns1:item>
</ns1:ItemRef>
</ItemUPCRef>
17 ноя 15, 17:15    [18430698]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как правильно разобрать xml  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Vinil, вы бы хоть показали - как его получаете, где и как собираетесь использовать.
17 ноя 15, 17:17    [18430715]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как правильно разобрать xml  [new]
Vinil
Member

Откуда:
Сообщений: 28
Извиняюсь, на ftp сервера выгружается файл xml такого формата, никак не получается загрузить его с помощью openxml

использовал конструкцию, но понимаю, что он не может найти ns1:, куда копать не могу понять.
SET @xmlns ='<root xmlns="http://www.oracle.com/retail/integration/base/bo/ItemUPCRef/v1"/>'

EXEC sp_xml_preparedocument @idoc OUTPUT ,@xml, @xmlns
	
select ITEM
from openxml(@idoc,'/ItemUPCRef/ItemRef',2)
with (
		 ITEM                   varchar(17)     'ns1:item'
	 )
EXEC sp_xml_removedocument @idoc
17 ноя 15, 17:22    [18430745]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как правильно разобрать xml  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vinil
куда копать не могу понять.

В сторону оглашения/демонстрации желаемого конечного результата.
17 ноя 15, 17:30    [18430807]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как правильно разобрать xml  [new]
Vinil
Member

Откуда:
Сообщений: 28
Glory,
В целях получения в конечном результате при обработке, значения которое используется в теге ns1:item, и вставка значение в таблицу

item
----------------
8713807007005
17 ноя 15, 17:36    [18430854]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как правильно разобрать xml  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
Declare @xml xml


set @xml = '<ItemUPCRef xmlns="http://www.oracle.com/retail/integration/base/bo/ItemUPCRef/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:ItemRef xmlns:ns1="http://www.oracle.com/retail/integration/base/bo/ItemRef/v1">
<ns1:item>8713807007005</ns1:item>
</ns1:ItemRef>
</ItemUPCRef>'


select	
	b.value( 'text()[1]', 'varchar(100)') as item
from	@xml.nodes('//*:item') a(b)
17 ноя 15, 17:54    [18430969]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как правильно разобрать xml  [new]
Vinil
Member

Откуда:
Сообщений: 28
Konst_One,

Огромное спасибо!
Искал просто решение, через openxml. Но всякий рабочий вариант, лучше не рабочего.
17 ноя 15, 20:58    [18431958]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как правильно разобрать xml  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Vinil
Извиняюсь, на ftp сервера выгружается файл xml такого формата, никак не получается загрузить его с помощью openxml

использовал конструкцию, но понимаю, что он не может найти ns1:, куда копать не могу понять.
SET @xmlns ='<root xmlns="http://www.oracle.com/retail/integration/base/bo/ItemUPCRef/v1"/>'

EXEC sp_xml_preparedocument @idoc OUTPUT ,@xml, @xmlns
	
select ITEM
from openxml(@idoc,'/ItemUPCRef/ItemRef',2)
with (
		 ITEM                   varchar(17)     'ns1:item'
	 )
EXEC sp_xml_removedocument @idoc

1. В @xmlns нужно задать неймспейс для корневого элемента в т.ч., т.к. в разметке он с неймспейсом (безпрефиксным).

2. В @xmlns для namespaces uri должны быть заданы префиксы, которые потом будут использоваться в XPath для openxml и with. Иначе попытка использования этих префиксов как в openxml, так и в with будет чревато ошибкой
XML parsing error: Reference to undeclared namespace prefix: 'ns1'.

3. В XPath для openxml узлы ItemUPCRef и ItemRef нужно также адресовать через префиксы неймспейсов (у каждого из упомянутых узлов неймспейс собственный).
Т.е. вот так:
declare
  @h int,
  @xml xml=N'
    <ItemUPCRef xmlns="http://www.oracle.com/retail/integration/base/bo/ItemUPCRef/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <ns1:ItemRef xmlns:ns1="http://www.oracle.com/retail/integration/base/bo/ItemRef/v1">
        <ns1:item>8713807007005</ns1:item>
      </ns1:ItemRef>
    </ItemUPCRef>',
  @xmlns xml=N'<ItemUPCRef
    xmlns:upc="http://www.oracle.com/retail/integration/base/bo/ItemUPCRef/v1"
    xmlns:ns1="http://www.oracle.com/retail/integration/base/bo/ItemRef/v1"/>';
exec sp_xml_preparedocument @h out, @xml, @xmlns;
select ITEM
from openxml(@h, '/upc:ItemUPCRef/ns1:ItemRef', 2)
with (
  ITEM varchar(7) 'ns1:item'
)
exec sp_xml_removedocument @h;

и да, длины в 7 символов для текстового узла внутри ns1:item недостаточно.
18 ноя 15, 06:10    [18433067]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как правильно разобрать xml  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Сон Веры Павловны, спасибо за подробное объяснение, кстати.

Только вчера вечером подумал, что не до конца понял, как дефалтовый неймспейс указать, и что надо бы уточняющий вопрос задать, как вы уже разжевали.
18 ноя 15, 10:33    [18433820]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить