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

Откуда:
Сообщений: 24
Имеются похожие XML с немного отличающимися путями.


В OPENXML можно применить следующую конструкция

declare @strXpath Varchar(12) = '/Ф123/ветка'
SELECT * 
FROM OPENXML(@hXml, @strXpath, 1)
WITH(
	Type CHAR(1) 'общ/@тип'
,	Part VARCHAR(255) 'общ/доля') AS A


Есть ли способ применить подобный подход с помощью XPath?
22 сен 11, 18:38    [11321580]     Ответить | Цитировать Сообщить модератору
 Re: Разбор Xml с изменяемым путем  [new]
iljy
Member

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

вы про это?
declare @x xml ='
<x> <y> txt</y><z> txt1</z></x>
<x2> <y> txt2</y><z> txt3</z></x2>
', @s varchar(100) = 'y'
select n.query('.')
from @x.nodes('/*/*[local-name() = sql:variable("@s")]') t(n)
22 сен 11, 19:02    [11321703]     Ответить | Цитировать Сообщить модератору
 Re: Разбор Xml с изменяемым путем  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Boshmax
Есть ли способ применить подобный подход с помощью XPath?
Есть, но он может быть неприменим в вашем случае, да и от точности интерпретации вашенго вопроса. Всё зависит от первоначальной задачи.

DECLARE	 @XML1	XML		= '<ABC Name="XYZ"/>'
-- Если название тега тупо пофигу
SELECT	 X.value('@Name','NVarChar(50)')
FROM	@XML1.nodes('*')A(X)

-- Если присутствуют мусорные теги
DECLARE	 @XML2	XML		= '<ABC Name="XYZ"/><DEF Name="UVW"/>'
	,@Name	NVarChar(50)	= 'DEF'
-- вариант 1
SELECT	X.value('@Name','NVarChar(50)')
FROM	@XML2.nodes('*')A(X)
WHERE	X.value('local-name(.)','NVarChar(50)') = @Name
-- вариант 2
SELECT	X.value('@Name','NVarChar(50)')
FROM	@XML2.nodes('*[local-name(.) = sql:variable("@Name")]')A(X)
Это не говоря что пересмотреть задачу и перенести на более эффективный подход.
XML на скуле, да и ещё XPath - не очень хороший вариант.
22 сен 11, 19:14    [11321761]     Ответить | Цитировать Сообщить модератору
 Re: Разбор Xml с изменяемым путем  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Ещё есть функция sql:column("columnName")
22 сен 11, 19:16    [11321782]     Ответить | Цитировать Сообщить модератору
 Re: Разбор Xml с изменяемым путем  [new]
Boshmax
Member

Откуда:
Сообщений: 24
спасибо

суть задачи(как пример)
есть 2 разных XML из каждого мне нужно получить номер счета
<ф503>
  <лицевой_счет номер="0203334" />
</ф503>

<ф512>
  <ЗАЛОГОДЕРЖАТЕЛЬ>
    <лицевой_счет номер="0203332" />
   </ЗАЛОГОДЕРЖАТЕЛЬ>
</ф512>

т.к. я за ранее знаю какая форма поступила я могу применить нужный путь
в OPENXML в переменную можно было путь указать полностью
например
--для первого xml
DECLARE @S varchar('ф503/лицевой_счет')  
--для второго xml
DECLARE @S varchar('ф503/ЗАЛОГОДЕРЖАТЕЛЬ/лицевой_счет')  

Можно ли в Xpath
в переменную забить всю строку
declare @x xml ='
<x> <y><z> txt1</z></y></x>
'
,	@s2 varchar(11) = 'y/x'
SELECT x.value('z[1]', 'VARCHAR(20)')
FROM @x.nodes('/*[local-name() = sql:variable("@s2")]') T(x)

т.к. данная конструкция теряет универсальность
declare @x xml ='
<x> <y><z> txt1</z></y></x>
'
,	@s varchar(10) = 'y'
,	@s1 varchar(11) = 'x'

SELECT x.value('z[1]', 'VARCHAR(20)')
FROM @x.nodes('/*[local-name() = sql:variable("@s1")]/*[local-name() = sql:variable("@s")]') T(x)
22 сен 11, 19:42    [11321860]     Ответить | Цитировать Сообщить модератору
 Re: Разбор Xml с изменяемым путем  [new]
iljy
Member

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

в вашем случае все гораздо проще
declare @x xml ='
<ф503>
  <лицевой_счет номер="0203334" />
</ф503>

<ф512>
  <ЗАЛОГОДЕРЖАТЕЛЬ>
    <лицевой_счет номер="0203332" />
   </ЗАЛОГОДЕРЖАТЕЛЬ>
</ф512>'

select n.query('.')
from @x.nodes('//лицевой_счет') t(n)
22 сен 11, 19:48    [11321877]     Ответить | Цитировать Сообщить модератору
 Re: Разбор Xml с изменяемым путем  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
1. Парсирование лучше вынести со скуля. Пусть клиент (апликейшн сервер) это делает.
Boshmax
есть 2 разных XML
из каждого мне нужно получить номер счета
2.
DECLARE	 @XML1	XML	= '<ф503><лицевой_счет номер="0203334"/></ф503>'
	,@XML2	XML	= '<ф512><ЗАЛОГОДЕРЖАТЕЛЬ><лицевой_счет номер="0203332"/></ЗАЛОГОДЕРЖАТЕЛЬ></ф512>'
-- Если название тегов тупо пофигу
SELECT X.value('@номер','NVarChar(50)') FROM @XML1.nodes('//лицевой_счет')A(X)
SELECT X.value('@номер','NVarChar(50)') FROM @XML2.nodes('//лицевой_счет')A(X)
И долго так выкручиваться.
22 сен 11, 19:51    [11321889]     Ответить | Цитировать Сообщить модератору
 Re: Разбор Xml с изменяемым путем  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iljy, накладывай монопольную блокировку на всю тему. :)
22 сен 11, 19:53    [11321895]     Ответить | Цитировать Сообщить модератору
 Re: Разбор Xml с изменяемым путем  [new]
iljy
Member

Откуда:
Сообщений: 8711
Mnior
iljy, накладывай монопольную блокировку на всю тему. :)

Да ладно, тут версионник Да и xml я знаю по стольку по скольку.
22 сен 11, 20:05    [11321943]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить