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

Откуда:
Сообщений: 96
Добрый день
В таблице entity есть поле с xml-записями разной структуры тегов, в зависимости от группы значений (указаны в другом поле таблицы entity)
Благодаря помощи на этом форуме, есть рабочий скрипт для парсинга строки xml
Подскажите пожалуйста, нет возможности автоматически создавать поля и наполнять их значениями с записи XML, не прибегая к ручному парсеру?

+

<r eid="e377bbad-e00b-480b-b078-bc6b72e08015"><revision>1969971</revision><lastModifyNode null="1"/><deleted>true</deleted><modified>2014-12-04T13:22:50.475+05:00</modified><created>2014-03-10T14:50:26.569+05:00</created><localId>51</localId><administrator>false</administrator><permissions/><supplier>false</supplier><employee>true</employee><client>false</client><pluginUser>false</pluginUser><system>false</system><code>46</code><mainRole>77881489-95df-4b23-857c-f44e2d606ec9</mainRole><roles><i>77881489-95df-4b23-857c-f44e2d606ec9</i></roles><pin>4444</pin><authCard><slip/></authCard><loginName/><passwordHash>da39a3ee5e6b4b0d3255bfef95601890afd80709</passwordHash><hireDate null="1"/><firstName null="1"/><middleName null="1"/><lastName null="1"/><address null="1"/><phone null="1"/><cellPhone null="1"/><pbxAuthorizationSettings><login/><password/><additionalNumber/></pbxAuthorizationSettings><gender>NOT_SPECIFIED</gender><note null="1"/><company null="1"/><taxpayerIdNumber null="1"/><accountingReasonCode null="1"/><businessClassificationCode null="1"/><economicActivityClassificationCode null="1"/><bik null="1"/><bank null="1"/><settlementAccount null="1"/><correspondentAccount null="1"/><legalAddress null="1"/><actualAddress null="1"/><hireDocumentNumber null="1"/><activationDate null="1"/><deactivationDate null="1"/><blockReason null="1"/><birthday null="1"/><email null="1"/><usePriceList>true</usePriceList><paymentDelay null="1"/><deviationAction>DISABLE</deviationAction><assignedToDepartments><i cls="Department">b25dc019-dd80-4e7b-a35f-fc07b587a26e</i><i cls="Department">d88d8499-7f40-42f8-8576-b2076a858537</i></assignedToDepartments><responsibilityDepartments/><jurPerson null="1"/><dontAllowOperationsWithoutCard>true</dontAllowOperationsWithoutCard><passportInfo null="1"/><representsStore>false</representsStore><properties/><priceCategory null="1"/><conception null="1"/><photoId null="1"/><supplierType null="1"/><name cls="LocalizableValue"><customValue>Виктор Чиж</customValue></name></r>
4 мар 16, 12:36    [18896389]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
fury_fury
Подскажите пожалуйста, нет возможности автоматически создавать поля

Что это значит ?
Вы хотите, чтобы при загрузке xml-я появились таблицы, которых не существует до загрузки ?
4 мар 16, 12:38    [18896397]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
fury_fury
Member

Откуда:
Сообщений: 96
Glory, да, что-то в этом направлении
Например, создавались темп-таблицы, и наполнялись значениями, исходя из тегов
Это только предположение
4 мар 16, 12:53    [18896499]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
fury_fury
Например, создавались темп-таблицы, и наполнялись значениями, исходя из тегов
Это только предположение

А вы готовы иметь в своем xml-файле иметь описание XSD схемы для всех загружаемых данных ?
Если да, то вам прямая дорога к SQLXMLBulkLoad
4 мар 16, 12:58    [18896523]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
Jaffar
Member

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

опиши точнее.
скрипт берет данные из поля таблички?
Что мешает подправить скрипт чтобы он брал данные откуда-то из другого места?
4 мар 16, 12:58    [18896525]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Если причесать XML к определенному виду, то можно использовать COLUMN_SET:

IF OBJECT_ID('dbo.x', 'U') IS NOT NULL
	DROP TABLE dbo.x
GO
CREATE TABLE dbo.x (
	id INT IDENTITY PRIMARY KEY,
	x XML COLUMN_SET FOR ALL_SPARSE_COLUMNS,
    revision VARCHAR(100) SPARSE NULL,
    deleted BIT SPARSE NULL,
    modified DATETIME2 SPARSE NULL,
    created DATETIME2 SPARSE NULL,
    localId INT SPARSE NULL
)
GO

DECLARE @x XML = '
<r>
  <revision>1969971</revision>
  <deleted>true</deleted>
  <modified>2014-12-04T13:22:50.475+05:00</modified>
  <created>2014-03-10T14:50:26.569+05:00</created>
  <localId>51</localId>
</r>'

INSERT INTO dbo.x (x)
SELECT @x.query('r/*')

SELECT id, revision, deleted, modified, created, localId
FROM dbo.x

Не знаю поможет ли это в Вашем случае...
4 мар 16, 13:01    [18896543]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
fury_fury
Member

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

вот если бы таблица создавалась с полями автоматически, исходя из набора тегов

CREATE TABLE dbo.x (
	id INT IDENTITY PRIMARY KEY,
	x XML COLUMN_SET FOR ALL_SPARSE_COLUMNS,
   [b] revision VARCHAR(100) SPARSE NULL,
    deleted BIT SPARSE NULL,
    modified DATETIME2 SPARSE NULL,
    created DATETIME2 SPARSE NULL,
    localId INT SPARSE NULL[/b]
)
GO

а так у меня сейчас такой же результат

Jaffar,
да, из поля, но набор тегов в записях - разный, таких вариантов больше сотни.
В том и вопрос, чтобы целевая таблица создавалась автоматически, с тем набором полей, что соответствует тегам.
набор тегов зависит от поля type исходной таблицы entity
4 мар 16, 13:40    [18896776]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
Владислав Колосов
Member

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

автор
вот если бы таблица создавалась с полями автоматически

На самом деле парадигма реляционных СУБД не одобряет замозарождение таблиц в процессе выполнения кода.
Придумайте другое решение.
4 мар 16, 13:45    [18896812]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9410
fury_fury
вот если бы таблица создавалась с полями автоматически, исходя из набора тегов
Можете внятно объяснить зачем для каждого набора тегов нужна отдельная таблица?
4 мар 16, 13:55    [18896887]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
fury_fury
В том и вопрос, чтобы целевая таблица создавалась автоматически, с тем набором полей, что соответствует тегам.
набор тегов зависит от поля type исходной таблицы entity

Для создание таблицы недостаточно только имен полей.

Если же вы просто не хотите перечислять имена полей, то есть

OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]

TableName
Is the table name that can be given (instead of SchemaDeclaration) if a table with the desired schema already exists and no column patterns are required.

-- Use OPENXML to provide rowset consisting of customer data.
INSERT Customers
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/Customers')
WITH Customers
4 мар 16, 13:55    [18896893]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
fury_fury
Member

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

таблицы справочников записаны только в этом поле. Эти записи извлекает сервер приложения и работает с ними в памяти. По крайней мере так говорят разработчики.
В базе sql есть только entity и таблицы фактов.
А нужно все это для создания хранилища для куба
4 мар 16, 14:39    [18897226]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
fury_fury
Member

Откуда:
Сообщений: 96
Владислав Колосов
fury_fury,

автор
вот если бы таблица создавалась с полями автоматически

На самом деле парадигма реляционных СУБД не одобряет замозарождение таблиц в процессе выполнения кода.
Придумайте другое решение.


Разработчики сообщают, что их база "не совсем реляционная", а "смесь с объектной схемой"
4 мар 16, 14:40    [18897234]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
fury_fury
Member

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

попробую, отпишусь
4 мар 16, 14:49    [18897288]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
fury_fury
Member

Откуда:
Сообщений: 96
Добрый день
Подскажите, как правильно распарсить XML-строку
+
<r eid="8bc08505-c81d-075d-8572-af7b636d049b"><revision>1969971</revision><lastModifyNode NULL="1"/><deleted>false</deleted><modified>2013-09-03T17:10:47.969+06:00</modified><created>2013-09-03T17:10:47.969+06:00</created><lastModifiedHash>0</lastModifiedHash><localId>2</localId><code>1</code><system>true</system><name cls="LocalizableValue"><customValue>Товар</customValue><defaultResourceId>DBSetup_accounting_category_goods</defaultResourceId><currentResourceId>DBSetup_accounting_category_goods</currentResourceId></name></r>


Использую код
+
 SELECT 
     e.id AS 'AccountingCategoryID',  
     e.TYPE AS 'Type',  
     t.n.VALUE('name[1]', 'varchar(100)') AS 'AccountingCategoryName'
    FROM ((SELECT CAST([xml] AS XML) AS xml, id, TYPE FROM [dbo].[entity] WHERE [TYPE] = 'AccountingCategory')) e CROSS apply  e.[xml].nodes('/r') t(n)


В поле "AccountingCategoryName" получаю
ТоварDBSetup_accounting_category_goodsDBSetup_accounting_category_goods
А нужно
Товар
7 мар 16, 20:10    [18906423]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
LoopN
Guest
t.n.value('name[1]/customValue[1]', 'varchar(100)') AS 'AccountingCategoryName'
7 мар 16, 21:46    [18906706]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический парсинг XML  [new]
fury_fury
Member

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

Спасибо Вам
7 мар 16, 22:12    [18906827]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить