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

Откуда:
Сообщений: 6
Добрый день!

Я читаю XML (XML тестовый, но эмитирует реальный файл):
DECLARE @xml_test XML

SELECT @xml_test =
'<DocRq xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="MOI">
	<EE>werwer
		<QQ>x</QQ>
	</EE>
	<EE>123
		<QQ>y</QQ>
	</EE>
	<EE>P-P
		<QQ>z</QQ>
	</EE>
</DocRq>'

DECLARE @xmlHandle int

EXEC sp_xml_preparedocument @xmlHandle output, @xml_test, '<DocRq xmlns:DocRq="MOI"/>'	--'<DocRq xmlns:a="MOI"/>'

SELECT
	*
FROM OPENXML(@xmlHandle, '/DocRq:DocRq/DocRq:EE')
WITH (
	EE varchar(1024) 'text()',	--'/DocRq:DocRq/DocRq:EE',
	QQ varchar(1024) '/DocRq:DocRq/DocRq:EE/DocRq:QQ')

EXEC sp_xml_removedocument @xmlHandle

Результат:
EEQQ
werwerx
123x
P-Px


Собственно проблема: значение в колонке QQ повторяется, а должно быть разное для каждого экземпляра тэга EE.
Если писать для EE вместо 'text()' путь к тэгу '/DocRq:DocRq/DocRq:EE' (то что закоментарено), то в первой колонке значения тоже начнут повторяться.
По поводу namespace xmlns="MOI": я в таком формате получаю XML, поэтому это убрать нельзя.

Подскажите, пожалуйста, как корректно прочесть файл, чтобы каждая строка в итоговом recordset-е содержала неповторяющиеся значения.
Спасибо.
12 янв 10, 10:41    [8169464]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся значения при чтении XML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

QQ varchar(1024) 'DocRq:QQ')

Posted via ActualForum NNTP Server 1.4

12 янв 10, 10:50    [8169535]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся значения при чтении XML  [new]
awaqxi
Member

Откуда:
Сообщений: 6
daw

QQ varchar(1024) 'DocRq:QQ')


Спасибо! В тестовом примере это помогло. Однако я видимо неверно составил пример. Приведу пример реальных данных:
DECLARE @xml_test XML

SELECT @xml_test =
'<DocRq xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="MOI">
  <MsgRq>
    <MsgUID>F0BE9C92-A899-410D-B42A-E5B0D9E6163D</MsgUID>
    <MsgOrder>1</MsgOrder>
    <ModRq>
      <Class>Deal</Class>
      <DealCurInfo>
        <DealId>
          <ObjUID>7F5C723E-7AB0-4C43-8BD1-29BE710FCA2D</ObjUID>
          <SrcId>2263235</SrcId>
          <SrcType>DealTicket</SrcType>
        </DealId>
	  </DealCurInfo>
	</ModRq>
  </MsgRq>
  <MsgRq>
    <MsgUID>3BDB90AF-6136-4849-B40F-DA0BDBCC4A07</MsgUID>
    <MsgOrder>2</MsgOrder>
	<ModRq>
	  <Class>Deal</Class>
	  <DealCurInfo>
		<DealId>
		  <ObjUID>0C556260-FCF3-4C29-A0F8-EFEF7EDFE1D0</ObjUID>
		  <SrcId>2263234</SrcId>
		  <SrcType>DealTicket</SrcType>
		</DealId>
	  </DealCurInfo>
	</ModRq>
  </MsgRq>
  <MsgRq>
    <MsgUID>5338A90A-6AF1-4BC4-8D1E-2C299F961BF4</MsgUID>
    <MsgOrder>3</MsgOrder>
    <ModRq>
      <Class>Deal</Class>
      <DealCurInfo>
        <DealId>
          <ObjUID>AFDEA467-55DB-47A0-B156-1BD5E7455CD6</ObjUID>
          <SrcId>2263232</SrcId>
          <SrcType>DealTicket</SrcType>
        </DealId>
	  </DealCurInfo>
	</ModRq>
  </MsgRq>
</DocRq>'

DECLARE @xmlHandle int

EXEC sp_xml_preparedocument @xmlHandle output, @xml_test, '<DocRq xmlns:DocRq="MOI"/>'

SELECT
	*
FROM OPENXML(@xmlHandle, '/DocRq:DocRq/DocRq:MsgRq/DocRq:ModRq/DocRq:DealCurInfo/DocRq:DealId')
WITH (
	MsgUID varchar(1024) '/DocRq:DocRq/DocRq:MsgRq/DocRq:MsgUID',
	MsgOrder varchar(1024) '/DocRq:DocRq/DocRq:MsgRq/DocRq:MsgOrder',
	Class varchar(1024) '/DocRq:DocRq/DocRq:MsgRq/DocRq:ModRq/DocRq:Class',
	DealId_ObjUID varchar(1024) '/DocRq:DocRq/DocRq:MsgRq/DocRq:ModRq/DocRq:DealCurInfo/DocRq:DealId/DocRq:ObjUID')

EXEC sp_xml_removedocument @xmlHandle

В результате опять значения повторяются:
MsgUIDMsgOrderClassDealId_ObjUID
F0BE9C92-A899-410D-B42A-E5B0D9E6163D1Deal7F5C723E-7AB0-4C43-8BD1-29BE710FCA2D
F0BE9C92-A899-410D-B42A-E5B0D9E6163D1Deal7F5C723E-7AB0-4C43-8BD1-29BE710FCA2D
F0BE9C92-A899-410D-B42A-E5B0D9E6163D1Deal7F5C723E-7AB0-4C43-8BD1-29BE710FCA2D


Хотелось бы понять:
1. Что нужно писать в параметре rowpattern проц. OPENXML. Я так понял здесь нужно прописать путь к самому глубокому используемому тэгу. Это верно?
FROM OPENXML(@xmlHandle, '/DocRq:DocRq/DocRq:MsgRq/DocRq:ModRq/DocRq:DealCurInfo/DocRq:DealId')
2. Что нужно писать в параметре ColPattern конструкции WITH? Я пишу путь к тэгу '/DocRq:DocRq/DocRq:MsgRq/DocRq:MsgUID' и получаю то что получаю - повторения.
MsgUID varchar(1024) '/DocRq:DocRq/DocRq:MsgRq/DocRq:MsgUID',
3. Что значит конструкция 'text()' в параметре ColPattern конструкции WITH?
12 янв 10, 11:25    [8169834]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся значения при чтении XML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Хотелось бы понять:
> 1. Что нужно писать в параметре rowpattern проц. OPENXML. Я так понял
> здесь нужно прописать путь к самому глубокому используемому тэгу. Это верно?
>
> FROM OPENXML(@xmlHandle,'/DocRq:DocRq/DocRq:MsgRq/DocRq:ModRq/DocRq:DealCurInfo/DocRq:DealId')

верно.

> 2. Что нужно писать в параметре ColPattern конструкции WITH? Я пишу путь
> к тэгу '/DocRq:DocRq/DocRq:MsgRq/DocRq:MsgUID' и получаю то что получаю
> - повторения.
>
> MsgUIDvarchar(*1024*)'/DocRq:DocRq/DocRq:MsgRq/DocRq:MsgUID',

так это потому что вы абсолютный путь пишете.
вот и берется просто первое такое найденное значение.
относительный пишите:

'../../../DocRq:MsgUID'

... - подъем на уровень вверх.

> 3. Что значит конструкция 'text()' в параметре ColPattern конструкции WITH?

значение первого текстового узла внутри элемента.
есть некоторая разница, указывать ли просто имя элемента или функцию text().
для сравнения:
DECLARE @xml_test XML

SELECT @xml_test =
'<root>
  <c><a>asdf<b>qqqq</b>wwww</a></c>
  <c><a /></c>
  </root>'

DECLARE @xmlHandle int

EXEC sp_xml_preparedocument @xmlHandle output, @xml_test

SELECT
	*
FROM OPENXML(@xmlHandle, '/root/c')
WITH (
	a varchar(1024) 'a',
	a_text varchar(1024) 'a/text()'
	)

EXEC sp_xml_removedocument @xmlHandle

Posted via ActualForum NNTP Server 1.4

12 янв 10, 11:53    [8170044]     Ответить | Цитировать Сообщить модератору
 Re: Повторяющиеся значения при чтении XML  [new]
awaqxi
Member

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

разобрался :)
все дело в волшебном поднятии на уровень вверх!
FROM OPENXML(@xmlHandle, '/DocRq:DocRq/DocRq:MsgRq/DocRq:ModRq/DocRq:DealCurInfo/DocRq:TermInfo')
WITH (
	MsgUID varchar(1024) '../../../DocRq:MsgUID',

по поводу text() также ясно.

еще раз спасибо.
12 янв 10, 12:31    [8170277]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить