Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
SOS. Начала делать xml.

Такой формат у Яндекс маркета.

<yml_catalog date="CURRENT DATE">
	<shop>
		<name>Yatto.ru</name>
		<company>Yatto</company>
		<url>http://www.magazin.ru/</url>
		<currencies>
			<currency id="RUR" rate="1" plus="0"/>
		</currencies>
		<categories>
		<category id="1">Оргтехника</category>
        <category id="10" parentId="1">Принтеры</category>
		</categories>
		<local_delivery_cost>300</local_delivery_cost>
		<offers>
			<offer id="12341" type="vendor.model" bid="13" cbid="20" available="true">
				<url>http://magazin.ru/product_page.asp?pid=14344</url>
				<price>15000</price>
				<currencyId>RUR</currencyId>
				<categoryId type="Own">101</categoryId>
				<picture>http://magazin.ru/img/device14344.jpg</picture>
				<delivery>true</delivery>
				<local_delivery_cost>300</local_delivery_cost>
				<typePrefix>Принтер</typePrefix>
				<vendor>НP</vendor>
				<vendorCode>Q7533A</vendorCode>
				<model>Color LaserJet 3000</model>
				<description>...</description>
				<manufacturer_warranty>true</manufacturer_warranty>
				<country_of_origin>Япония</country_of_origin>
			</offer>
		</offers>
	</shop>
</yml_catalog>


Как правильней сделать?
я думала сначала статичную часть (все кроме тэгов категорий и предложений) положить в переменную типа xml и создать объектную модель при помощи openxml. и потом добавлять ноды.

Или можно куски эти в xml как в текстовую строку вставить?

и самый важный вопрос можно при при помощи path сделать чтобы и аттрибуты были у тэга и значение у этого же тега.
Не могу найти.

<categories>
        <category id="10" parentId="1">Принтеры</category>
</categories>

или даже это <category id="10" parentId="1">Принтеры</category>

Или только explicit

DECLARE @x xml
	SET @x=(SELECT [category_id] as [@id],
					parent_id as [@parentId], 
					[display_name] as category 
		        FROM category
        FOR XML path('category'), root('categories'),type)
        
  SELECT @x


это дает мне тег
<categories>
  <category id="cat_accessoires_man" parentId="cat_man">
    <category>Аксессуары</category>
  </category>
</categories>


а мне нужно
<categories>
  <category id="cat_accessoires_man" parentId="cat_man"> Аксессуары </category>
</categories>


Модератор: Используйте тег src, пожалуйста


Сообщение было отредактировано: 22 апр 14, 14:43
22 апр 14, 14:35    [15916215]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
_human
Member

Откуда:
Сообщений: 569
Яна Мотолана,

делал когда-то для яндекс карт здоровенную XML-ину..
EXPLICIT может все.
22 апр 14, 14:42    [15916286]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Glory
Member

Откуда:
Сообщений: 104751
Яна Мотолана
Как правильней сделать?

Из каких входных данных вы собрались это делать ?
22 апр 14, 14:46    [15916343]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
Здорово!
Напишите алгоритм как вы делали.

Есть таблица категорий, есть таблица товаров.. джойны то се... это я разберусь. Я сейчас больше про архитектуру.

И можно ли в path сделать, чтобы и в теге значение было и был определен параметр у этого же тега.
22 апр 14, 14:51    [15916384]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
_human
Member

Откуда:
Сообщений: 569
Яна Мотолана,
для path не знаю, а с EXPLICIT можно все - назвать тег, указать атрибуты и значения иерархия и еще куча всего.
22 апр 14, 15:03    [15916500]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
_human
Member

Откуда:
Сообщений: 569
Яна Мотолана
Напишите алгоритм как вы делали.

структура xml для Яндекс маркета и карт разная.
22 апр 14, 15:04    [15916514]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
ну то есть
1. написать огромную xml и все вложенности написать в одном запросе использую union и explicit
2. Статичную часть вынести в переменную типа xml. И куски категорий и предложений выгрузить так же в переменные типа xml.
Только как потом один кусок xml вставить в другой. Открыв первый при помощи open xml, и через объекную можель вставить новые узлы?
3. Или вообще все эти куски хранить в текстовых переменный и потом сконкатенировать? боюсь нарваться на trancate
22 апр 14, 15:06    [15916553]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
_human
Member

Откуда:
Сообщений: 569
Яна Мотолана
1. написать огромную xml и все вложенности написать в одном запросе использую union и explicit

да. Все сделать одним здоровым запросом который вам вернет полностью готовую XML согласно спецификации яндекса.
Яна Мотолана
Статичную часть вынести в переменную типа xml.

я не знаю зачем это. для карт достаточно было предоставить информицию в xml по хотлинку и яндекс-сервис отрисует все объекты на карте.

у вас что-то там динамически должно формироваться ?
у яндекса кстати есть собственный суппорт-форум. можете там еще узнать.
22 апр 14, 15:13    [15916616]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
Да нужен суппорт.
Статичная часть это заголовки и прочее. То, что береться не из базы.

<yml_catalog date="2010-04-01 17:00">
<shop>
<name>Magazin</name>
<company>Magazin</company>
<url>http://www.magazin.ru/</url>
<currencies>
<currency id="RUR" rate="1" plus="0"/>
</currencies>

Динамика это категории. Просто плодить столько union для для множества этих безаттрибутных тэгов...

ина вопрос про зфер никто не ответил.
Можно ли через path (или без использования explicit) осуществить такое
<categories>
<category id="1">Оргтехника</category>
</categories>
22 апр 14, 15:17    [15916658]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
Правильно я понимаю что для каждого тэга в конструкторе explicit нужен новый union. По другому не нашла.
тогда получается для этой конструкции <offers>
<offer id="12341" type="vendor.model" bid="13" cbid="20" available="true">
<url>http://magazin.ru/product_page.asp?pid=14344</url>
<price>15000</price>
<currencyId>RUR</currencyId>
<categoryId type="Own">101</categoryId>
<picture>http://magazin.ru/img/device14344.jpg</picture>
<delivery>true</delivery>
<local_delivery_cost>300</local_delivery_cost>
<typePrefix>Принтер</typePrefix>
<vendor>НP</vendor>
<vendorCode>Q7533A</vendorCode>
<model>Color LaserJet 3000</model>
<description>...</description>
<manufacturer_warranty>true</manufacturer_warranty>
<country_of_origin>Япония</country_of_origin>
</offer>

столько union нужнго.... а теги почти все без атриббутные..
22 апр 14, 15:20    [15916691]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Glory
Member

Откуда:
Сообщений: 104751
Яна Мотолана
Статичная часть это заголовки и прочее. То, что береться не из базы.

И что смешает включить ее сразу в общий запрос ?

Яна Мотолана
ина вопрос про зфер никто не ответил.
Можно ли через path (или без использования explicit) осуществить такое
<categories>
<category id="1">Оргтехника</category>
</categories>

Из каких исходных данных получить то ?

Яна Мотолана
Правильно я понимаю что для каждого тэга в конструкторе explicit нужен новый union.

Неправильно
Элементарный пример из хелпа это подтверждает
SELECT 1    as Tag,
       NULL as Parent,
       E.BusinessEntityID as [Employee!1!EmpID],
       NULL       as [Name!2!FName],
       NULL       as [Name!2!LName]
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID
UNION ALL
SELECT 2 as Tag,
       1 as Parent,
       E.BusinessEntityID,
       FirstName, 
       LastName 
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID
ORDER BY [Employee!1!EmpID],[Name!2!FName]
FOR XML EXPLICIT;
22 апр 14, 15:23    [15916732]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
ну у вас 2 union и 2 тега. Не вижу пока в вашем элементарном примере.
Пришлите мне лучше пример чтобы было 2 union и 10 разных тегов.
22 апр 14, 15:30    [15916800]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Glory
Member

Откуда:
Сообщений: 104751
Яна Мотолана
и 2 тега.

Хмм. А дайте свое определение, что такое "тег"
22 апр 14, 15:33    [15916819]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
_human
Member

Откуда:
Сообщений: 569
Яна Мотолана
ну у вас 2 union и 2 тега. Не вижу пока в вашем элементарном примере.
Пришлите мне лучше пример чтобы было 2 union и 10 разных тегов.

каждый union добавляет строки(у) в universal table.
Вы можете в одном union сделать множество тегов. Тег это поле в universal table. Если я ничего не путаю))

Картинка с другого сайта.
22 апр 14, 15:35    [15916841]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
<Из каких исходных данных получить то ?>
Да какая разница из каких, можно просто текстовые строки использовать..
Вопрос можно ли это сделать через path.

все разобралась.. вот если так, но там тег новый формируется newTag, а мне он нафик не нужен. Нужно только переименовать поле
DECLARE @x xml
SET @x=(SELECT 'testData1' as [@attr],'testData2' as NewTag
FOR XML path('category'), root('categories'),type)

SELECT @x

А если не рисовать NewTag то рисуется в тег, что указан в path Path, даже если колонки через запятую.

DECLARE @x xml
SET @x=(SELECT 'testData1' as [@attr],'testData2','testData3'
FOR XML path('category'), root('categories'),type)

SELECT @x
22 апр 14, 15:41    [15916912]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
не не работает с path(( Он все рfвно равно рисует тег - наименование колонки..
22 апр 14, 15:42    [15916924]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Glory
Member

Откуда:
Сообщений: 104751
SELECT 1    as Tag,
       NULL as Parent,
       E.BusinessEntityID  as [Employee!1!EmpID],
       BEA.AddressID as [Employee!1!AddressID],
       NULL       as [Name!2!FName],
       NULL       as [Name!2!LName],
       NULL        as [Address!2!AddressID],
       NULL        as [Address!2!AddressLine1],
       NULL        as [Address!2!AddressLine2],
       NULL        as [Address!2!City]
FROM   HumanResources.Employee AS E
INNER JOIN Person.BusinessEntityAddress AS BEA
    ON E.BusinessEntityID = BEA.BusinessEntityID

UNION ALL
SELECT 2 as Tag,
       1 as Parent,
       E.BusinessEntityID,
       BEA.AddressID,
       A.FirstName, 
       A.LastName,
       A.AddressID,
       AddressLine1, 
       AddressLine2,
       City 
FROM   HumanResources.Employee AS E
INNER JOIN Person.BusinessEntityAddress AS BEA
    ON E.BusinessEntityID = BEA.BusinessEntityID
INNER JOIN Person.Address AS A
    ON BEA.AddressID = A.AddressID
ORDER BY [Employee!1!EmpID],[Address!2!AddressID]
FOR XML EXPLICIT;
22 апр 14, 15:45    [15916961]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Glory
Member

Откуда:
Сообщений: 104751
Яна Мотолана
Да какая разница из каких, можно просто текстовые строки использовать..

Потому что вашу тему напоминает
Как мне получить в результате 4 ? Ну просто чтобы было 4? Чтобы я что-то запустила и у меня на экране появилось 4 ?
22 апр 14, 15:47    [15916978]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
<каждый union добавляет строки(у) в universal table.
Вы можете в одном union сделать множество тегов. Тег это поле в universal table. Если я ничего не путаю)) >


Извините. Определение тэга я имела в виду.
Тегом называла не массив одинаковых тегов, как например
<category id="16" parentId="3">Детская литература</category>
<category id="4">Музыка и видеофильмы</category>
<category id="17" parentId="4">Музыка</category>
<category id="18" parentId="4">Видеофильмы</category>
<category id="5">Путешествия</category>
<category id="19" parentId="5">Туры</category>
<category id="20" parentId="5">Авиабилеты</category>
<category id="6">Билеты на мероприятия</category>

тут один тег category и Множество записей.

а вот например давайте нарисуем выборку такую.

Одна запись выборки:
<offer id="12341" type="vendor.model" bid="13" cbid="20" available="true">
<url>http://magazin.ru/product_page.asp?pid=14344</url>
<price>15000</price>
<currencyId>RUR</currencyId>
<categoryId type="Own">101</categoryId>
<picture>http://magazin.ru/img/device14344.jpg</picture>
<delivery>true</delivery>
<local_delivery_cost>300</local_delivery_cost>
<typePrefix>Принтер</typePrefix>
<vendor>НP</vendor>
<vendorCode>Q7533A</vendorCode>
<model>Color LaserJet 3000</model>
<description>...</description>
<manufacturer_warranty>true</manufacturer_warranty>
<country_of_origin>Япония</country_of_origin>
</offer>

чтобы выборку такую нарисовать, сколько union будет?
22 апр 14, 15:51    [15917036]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Glory
Member

Откуда:
Сообщений: 104751
Яна Мотолана
чтобы выборку такую нарисовать, сколько union будет?

Чтобы рисовать union-ы не нужны.
union-ы нужны, чтобы писать запросы.
Вы хотите, чтобы вам кто-то написал готовый запрос по таблицам, которые вы так упорно скрываете ?
22 апр 14, 15:53    [15917057]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
_human
Member

Откуда:
Сообщений: 569
Яна Мотолана
сколько union будет?

вам еще вначале намекнули пользоваться главным тегом SRC
22 апр 14, 15:54    [15917063]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
_human
Яна Мотолана
сколько union будет?

вам еще вначале намекнули пользоваться главным тегом SRC


Я час назад зарегистрировалась)
Хорошо. Спасибо и прощу прощения за нарушение порядка.
с эксплиситом поразбираюсь. Спасибо всем.
22 апр 14, 16:09    [15917222]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Яна Мотолана
Member

Откуда:
Сообщений: 30
Яна Мотолана
_human
пропущено...

вам еще вначале намекнули пользоваться главным тегом SRC


Я час назад зарегистрировалась)
Хорошо. Спасибо и прощу прощения за нарушение порядка.
с эксплиситом поразбираюсь. Спасибо всем.


Да тут система ATG оракловая.. Туча таблиц.
Меня механизм в целом интересовал, как правильнее, а с данными разобраться для выгрузки это уже техническая часть..
22 апр 14, 16:12    [15917253]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Яна Мотолана,

PATH появился в 2005 как более простая альтернатива EXPLICIT. По функционалу они эквивалентны - через PATH тоже можно получить любой XML (в отличие от AUTO, например).

В большинстве случаев написать запрос через PATH проще и короче. По производительности... ну не знаю, попробуйте сделать оба варианта и сравнить, если действительно жмет.

А так, хотите конкретных советов - задавайте конкретные вопросы. В т.ч. и со структурой таблиц, угадывать ее никому не интересно.
23 апр 14, 08:30    [15920167]     Ответить | Цитировать Сообщить модератору
 Re: Создание xml (YML) для Yandex Market. For xml explicit или path  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
макет c PATH чото типа такого
declare @shops table(id int,name varchar(50),company varchar(50),url varchar(50)) 
insert into @shops(id,name,company,url) values(1,'Yatto.ru','Yatto','http://www.magazin.ru/')
insert into @shops(id,name,company,url) values(2,'Bla-Bla.ru','Bla-Bla','http://www.magazin.ru/')

declare @categories table(id int,parentid int,name varchar(50)) 
insert into @categories(id,parentid,name)values(1,null,'Оргтехника')
insert into @categories(id,parentid,name)values(10,1,'Принтеры')
insert into @categories(id,parentid,name)values(2,null,'Грабли')

declare @ShopCategories table (ShopID int,categoryid int)
insert into @ShopCategories(shopID,categoryid) values(1,1)
insert into @ShopCategories(shopID,categoryid) values(1,10)
insert into @ShopCategories(shopID,categoryid) values(2,2)


declare @offers table(id int,shopid int,type varchar(50),bid int, cbid int, available bit,price money,categoryid int)
insert into @offers(id,shopid,type,bid,cbid, available,price,categoryid)
values(12341,1,'vendor.model',13,20,1,1500,10)
insert into @offers(id,shopid,type,bid,cbid, available,price,categoryid)
values(12555,2,'bla-bla.model',10,100,0,2500,2)



SELECT getdate() AS [@date]
,(SELECT name,company,url
	 ,(SELECT c.id as [@id],c.parentid as [@parentid],c.name
	  FROM @ShopCategories sc join @categories c on c.id = sc.categoryid
	  WHERE sc.shopid = s.id
	 order by parentid,id 
	 FOR XML PATH('category'),root('categories'),type
	) AS [*]
	 ,(SELECT sc.id as [@id],sc.[type] as [@type],sc.bid as [@bid],sc.cbid as [@cbid],sc.available as [@available]
	   ,sc.price
	   ,(SELECT c1.name as [@type],c1.id as [*]
		FROM @categories c1
	    WHERE c1.id  =  sc.categoryid
	    FOR XML PATH('categoryid'),type
	    )AS [*]
	  FROM @offers sc 
	  WHERE sc.shopid = s.id
	 order by sc.id 
	 FOR XML PATH('offer'),root('offers'),type
	) AS [*]
 FROM @shops s
 FOR XML PATH('shop'),type
) AS [*]
FOR XML PATH('yml_catalog')
23 апр 14, 10:01    [15920446]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить