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

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 167
Здравствуйте, о Гуру!
Подскажите, пжл, как распарсить такой XML?

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <dict_CitiesResponse xmlns="http://ltl-ws.major-express.ru/edclients/">
      <dict_CitiesResult>
        <EDCity>
          <Code>73</Code>
          <Name>Архангельск</Name>
          <EngName>ARKHANGELSK</EngName>
          <IsShipper>true</IsShipper>
        </EDCity>
        <EDCity>
          <Code>74</Code>
          <Name>Астрахань</Name>
          <EngName>ASTRAKHAN</EngName>
          <IsShipper>true</IsShipper>
        </EDCity>
        <EDCity>
          <Code>75</Code>
          <Name>Барнаул(Алтайский край)</Name>
          <EngName>BARNAUL</EngName>
          <IsShipper>true</IsShipper>
        </EDCity>
        <EDCity>
          <Code>76</Code>
          <Name>Белгород</Name>
          <EngName>BELGOROD</EngName>
          <IsShipper>true</IsShipper>
        </EDCity>
      </dict_CitiesResult>
    </dict_CitiesResponse>
  </soap:Body>
</soap:Envelope>



пытаюсь сделать так, но ничего не выводится(:

 select
 b.n.value('@Code', 'int') as CodeCity
 --b.n.value('@Name', 'nvarchar(200)') as NameCity,
 --b.n.value('@EngName', 'nvarchar(200)') as EngName, 
 --b.n.value('@IsShipper', 'varchar(10)') as IsShipper
from
 [dbo].[tblMAJORtmpXML] a cross apply
 a.y.nodes('//EDCity') b(n);


В таблице tblMAJORtmpXML столбец y (тип xml)
Спасибо заранее за любую помощь!
6 май 19, 14:04    [21878879]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 29
Почитайте за xml namespace:

DECLARE @xml XML = N'
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <dict_CitiesResponse xmlns="http://ltl-ws.major-express.ru/edclients/">
      <dict_CitiesResult>
        <EDCity>
          <Code>73</Code>
          <Name>Архангельск</Name>
          <EngName>ARKHANGELSK</EngName>
          <IsShipper>true</IsShipper>
        </EDCity>
        <EDCity>
          <Code>74</Code>
          <Name>Астрахань</Name>
          <EngName>ASTRAKHAN</EngName>
          <IsShipper>true</IsShipper>
        </EDCity>
        <EDCity>
          <Code>75</Code>
          <Name>Барнаул(Алтайский край)</Name>
          <EngName>BARNAUL</EngName>
          <IsShipper>true</IsShipper>
        </EDCity>
        <EDCity>
          <Code>76</Code>
          <Name>Белгород</Name>
          <EngName>BELGOROD</EngName>
          <IsShipper>true</IsShipper>
        </EDCity>
      </dict_CitiesResult>
    </dict_CitiesResponse>
  </soap:Body>
</soap:Envelope>'

SELECT b.n.value('(*:Code/text())[1]', 'INT') AS CodeCity
     , b.n.value('(*:Name/text())[1]', 'NVARCHAR(200)') AS NameCity
     , b.n.value('(*:EngName/text())[1]', 'NVARCHAR(200)') AS EngName
     , b.n.value('(*:IsShipper/text())[1]', 'VARCHAR(10)') AS IsShipper
FROM @xml.nodes('//*:EDCity') b(n)

;WITH XMLNAMESPACES(DEFAULT 'http://ltl-ws.major-express.ru/edclients/')
SELECT b.n.value('(Code/text())[1]', 'INT') AS CodeCity
     , b.n.value('(Name/text())[1]', 'NVARCHAR(200)') AS NameCity
     , b.n.value('(EngName/text())[1]', 'NVARCHAR(200)') AS EngName
     , b.n.value('(IsShipper/text())[1]', 'VARCHAR(10)') AS IsShipper
FROM @xml.nodes('//EDCity') b(n)
6 май 19, 14:15    [21878910]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 167
Sergey Syrovatchenko,
Спасибо ВАМ Большое!
6 май 19, 14:19    [21878925]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
uaggster
Member

Откуда:
Сообщений: 566
Sergey Syrovatchenko, попутный вопрос, если можно:
1. А как же Ваш ник AlanDenton? Или Вы подражатель?
Судя по стилю '(Code/text())[1]', а не вот так: '(Code)[1]', это действительно Вы :-)
6 май 19, 14:30    [21878960]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 29
-SWAN-
Спасибо

Рад был помочь.

uaggster
А как же Ваш ник AlanDenton? Или Вы подражатель?

Давно так не смеялся ))) контору быстро попалили мою.
Решил перейти в официоз, потому что сегодня-завтра на форуме хочу сделать небольшой анонс своего проекта.
6 май 19, 14:33    [21878977]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 4799
Sergey Syrovatchenko
Давно так не смеялся ))) контору быстро попалили мою.

да уж года как 4 назад
https://habr.com/ru/post/273189/
6 май 19, 16:16    [21879113]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
court
Member

Откуда:
Сообщений: 1663
uaggster
Судя по стилю '(Code/text())[1]', а не вот так: '(Code)[1]', это действительно Вы :-)

собстно, дело ведь не в "стиле", а в "результате" :)
"0" вместо NULL при разборе XML
7 май 19, 04:48    [21879519]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 167
Sergey Syrovatchenko,

увы,у меня еще заминка(((
Подскажите, пожалуйста, как распарсить вот такой вариант XML:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <dict_ConsigneesResponse xmlns="http://ltl-ws.major-express.ru/edclients/">
      <dict_ConsigneesResult>
        <AddressBook>
          <ID>1545349</ID>
          <Address>
            <Person>Рогонов Евгений Олегович</Person>
            <Phone>89875041789</Phone>
            <Company>"НовоТайм 58"</Company>
            <Address>г. Пенза,Саранская 43а</Address>
            <PostIndex />
            <CityCode>105</CityCode>
          </Address>
        </AddressBook>
        <AddressBook>
          <ID>1135794</ID>
          <Address>
            <Person>Николаева Валентина</Person>
            <Phone>8-968-712-31-12</Phone>
            <Company>"ПК" Пушкинская площадь"</Company>
            <Address>улица Шоссейная д. 4Д</Address>
            <PostIndex />
            <CityCode>129</CityCode>
          </Address>
        </AddressBook>
        <AddressBook>
          <ID>1117808</ID>
          <Address>
            <Person>Елена</Person>
            <Phone>+7 964 508 27 37, +7 495 775 07 28</Phone>
            <Company>"Свотч Групп"</Company>
            <Address>Тверская д.4 бутик Tissot .  С 10 до 22.</Address>
            <PostIndex />
            <CityCode>129</CityCode>
          </Address>
        </AddressBook>
      </dict_ConsigneesResult>
    </dict_ConsigneesResponse>
  </soap:Body>
</soap:Envelope>



пробовал сделать так, ID выводится, но вот как добраться до Person?

 select
 b.n.value('(*:ID/text())[1]', 'INT') AS ID,
 b.n.value('(*:Address/Person/text())[1]', 'nvarchar(200)') AS Person
from
 [dbo].[tblMAJORtmpConsigneesXML] a cross apply
 a.y.nodes('//*:AddressBook') b(n);


Спасибо заранее за советы!
7 май 19, 15:23    [21880062]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
Sergey Syrovatchenko
Member

Откуда: Харьков
Сообщений: 29
SELECT b.n.value('(*:ID/text())[1]', 'INT') AS ID
     , b.n.value('(*:Address/*:Person/text())[1]', 'NVARCHAR(200)') AS Person
FROM @xml.nodes('//*:AddressBook') b(n)
7 май 19, 15:28    [21880073]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 167
Sergey Syrovatchenko,

Сергей, спасибо Вам за помощь!)
7 май 19, 15:32    [21880076]     Ответить | Цитировать Сообщить модератору
 Re: Распарсить XML  [new]
uaggster
Member

Откуда:
Сообщений: 566
court
uaggster
Судя по стилю '(Code/text())[1]', а не вот так: '(Code)[1]', это действительно Вы :-)

собстно, дело ведь не в "стиле", а в "результате" :)
"0" вместо NULL при разборе XML

Я так понял, это для того, чтобы уменьшить количество вызовов функции xml-парсера. Типа вбитый рефлекс.
:-)
7 май 19, 19:32    [21880336]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить