powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вытащить данные из сложной и многоуровневой XML?
18 сообщений из 68, страница 3 из 3
Как вытащить данные из сложной и многоуровневой XML?
    #39935946
iliych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если ИИ по какоц-то причине вам не подъодит начните SCRUM-проект по вытаскиванию данных. Пригласите сертифицированных скрам-мастера CSM®, скрам продакт оунера CSPO®, скрам-разработчиков CSD®. Задача по моим подсчётам на 6 спринтов по неделе на спринт если все скрамеры сертифицированные. Через 1.5 месяца работы скрамеров данные будут вытаскиваваться откуда угодно куда угодно.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #39935979
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Правда SSIS я не пользуюсь, голый sqlXmlBulkLoad.

Нужно именно SSIS, пока другие варианты не рассматриваются.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039725
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с такой проблемой. В xml файле элементы в одинаковых блоках расположены в разном порядке. Причем ошибка возникает при проверке схемы, а при выполнении порядок не важен.
Как описать элементы, чтобы валидация проходила успешно?
Используется spXmlBulkLoad
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039826
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dik_68
Столкнулся с такой проблемой. В xml файле элементы в одинаковых блоках расположены в разном порядке. Причем ошибка возникает при проверке схемы, а при выполнении порядок не важен.
Как описать элементы, чтобы валидация проходила успешно?
Используется spXmlBulkLoad
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<root>
  <node>
    <a />
    <b />
    <c />
  </node>
  <node>
    <b />
    <a />
    <c />
  </node>
  <node>
    <c />
    <b />
    <a />
  </node>
</root>

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<xs:schema
  attributeFormDefault="unqualified"
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="node">
          <xs:complexType>
            <xs:sequence>
              <xs:choice maxOccurs="unbounded">
                <xs:element name="a" />
                <xs:element name="b" />
                <xs:element name="c" />
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Да, имейте в виду, что по такой схеме вполне провалидируется вот такое:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<root>
  <node>
    <a />
    <a />
    <a />
  </node>
</root>
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039832
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, всё же лучше так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<xs:schema
  attributeFormDefault="unqualified"
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="node">
          <xs:complexType>
            <xs:all minOccurs="1">
              <xs:element name="a" />
              <xs:element name="b" />
              <xs:element name="c" />
            </xs:all>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039838
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dik_68
Столкнулся с такой проблемой. В xml файле элементы в одинаковых блоках расположены в разном порядке. Причем ошибка возникает при проверке схемы, а при выполнении порядок не важен.
Как описать элементы, чтобы валидация проходила успешно?
Используется spXmlBulkLoad


В комплекте Visual Studio есть утилита XSD.exe.
Скорми ей свой XML - получишь валидную схему... или отлуп.
Схему допилишь руками.

Ну и выкинь spXmlBulkLoad.
sqlXmlBulkLoad - наше фсе...
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039854
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
В комплекте Visual Studio есть утилита XSD.exe.

Ну вот он как раз и сгенерит схему с xs:choise maxOccurs="unbounded", которая не вполне корректна.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039947
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
aleks222
В комплекте Visual Studio есть утилита XSD.exe.

Ну вот он как раз и сгенерит схему с xs:choise maxOccurs="unbounded", которая не вполне корректна.

Наши руки не для скуки.

ЗЫ. А чего невалидного "xs:choise maxOccurs="unbounded""?
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40039971
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
ЗЫ. А чего невалидного "xs:choise maxOccurs="unbounded""?

Валидно всё, только вот сама эта схема может отвалидировать, т.е. признать корректной, кривую структуру:

Сон Веры Павловны
Да, имейте в виду, что по такой схеме вполне провалидируется вот такое:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<root>
  <node>
    <a />
    <a />
    <a />
  </node>
</root>


- если человеку нужно, чтобы внутри node были в любой последовательности, но обязательно по 1 экземпляру ноды a, b, c, то такая валидация ему явно не подходит.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40040015
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за ответы.
Требования такие:
1. Наличие не обязательно
2. Порядок произвольный
3. Повторы не допускаются

зы Еще вопрос: Все данные находятся только в элементах и привязка к предыдущему уровню определяется только структурой. Есть возможность, чтобы ключи в SQL заполнялись процедурой, а не самим сервером? (Аналогично, как в openrowset были @mp:id и @mp:parentid)
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40040019
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222

Ну и выкинь spXmlBulkLoad.
sqlXmlBulkLoad - наше фсе...


Это типа шутка ?
В ней же sqlXmlBulkLoad и используется

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
alter PROCEDURE [dbo].[spXMLBulkLoad] (
	 @@File		SysName
	,@@Schema	SysName
	,@@DataBase	SysName	= '<DefaultDataBase>'
) AS BEGIN -- EXEC dbo.spXMLBulkLoad 'Z:\Path\Data.xml','Z:\Path\Schema.xsd'
	 --EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
	DECLARE	 @ErrCode	Int
		,@OLEXMLBulk	Int
		,@ErrMethod	SysName
		,@ErrSource	SysName
		,@ErrDescript	NVarChar(4000)
	SET @ErrSource = 'E:\SQLXML\error.log'	--  файл ошибки (OPENROWSET требует константу)
	EXEC @ErrCode = sys.sp_OACreate 'SQLXMLBulkLoad.SQLXMLBulkload' ,@OLEXMLBulk OUT
	IF (@ErrCode = 0) BEGIN
		SET	@@DataBase	= 'Provider=SQLOLEDB;Data Source=.;DataBase=' + @@DataBase + ';Integrated Security=SSPI;CODEPAGE=1251;'
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'ConnectionString'	,@@DataBase		IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'ConnectionString'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'ErrorLogFile'	,@ErrSource		IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'ErrorLogFile'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'CheckConstraints'	,0			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'CheckConstraints'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'KeepIdentity'	,0			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'Transaction'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'Transaction'	,1			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'Transaction'	GOTO Error END
		EXEC @ErrCode = sys.sp_OASetProperty	@OLEXMLBulk ,'SchemaGen'	,0			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'SchemaGen'	GOTO Error END



		EXEC @ErrCode = sys.sp_OAMethod		@OLEXMLBulk ,'Execute', NULL	,@@Schema, @@File
		IF (@ErrCode != 0) BEGIN
			SET @ErrMethod = 'Execute'
			DECLARE	 @Exist	Int
				,@Error	XML
			EXEC	master.dbo.xp_FileExist	@ErrSource, @Exist OUT
			IF (@Exist = 1) BEGIN
				SELECT	 @Error		= E.Error
							-- Обход глюка
							+ CASE	WHEN Right(E.Error,1) != '>'	THEN 'lt>'
								ELSE ''				END
				FROM	OPENROWSET(BULK 'E:\SQLXML\error.log',SINGLE_NCLOB)E(Error) -- Из @ErrSource файла
				SELECT	@ErrDescript	= IsNull(@ErrDescript	,'') + E.Error.value('Description[1]','SysName') + ' '
				FROM	@Error.nodes('/Result/Error')E(Error)
				SELECT	@ErrDescript	= IsNull(@ErrDescript	,'') + E.Error.value('Description[1]','SysName') + ' '
				FROM	@Error.nodes('/Error/Record')E(Error)
			END ELSE
				GOTO Error
		END
		GOTO Destroy
	Error:	EXEC @ErrCode = sys.sp_OAGetErrorInfo	@OLEXMLBulk ,@ErrSource OUT ,@ErrDescript OUT
	Destroy:EXEC @ErrCode = sys.sp_OADestroy	@OLEXMLBulk
	END ELSE
		SELECT	 @ErrMethod	= 'SQLXMLBulkLoad.SQLXMLBulkload'
			,@ErrSource	= 'sp_OACreate'
			,@ErrDescript	= 'Ошибка создания OLE объекта'
	-- Вывод ошибок
	IF (@ErrMethod IS NOT NULL) BEGIN
		RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@ErrMethod,@ErrSource,@ErrDescript)
		RETURN	@@Error
	END
END


...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40040916
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вопрос: Все данные находятся только в элементах и привязка к предыдущему уровню определяется только структурой. Есть возможность, чтобы ключи в SQL заполнялись процедурой, а не самим сервером? (Аналогично, как в openrowset были @mp:id и @mp:parentid)
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40040933
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dik_68
Есть возможность, чтобы ключи в SQL заполнялись процедурой, а не самим сервером?


Что такое "ключи"?
От квартиры, где деньги лежат?
sqlXmlBulkLoad не может занести в базу то, "чего нет в XML".
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40041060
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Что такое "ключи"?

Я про заполнение поля в дочерней таблице значением ключа из родительской.
При импорте через openrowset их тоже в xml нет, но процедура их заполняет фактически номерами строк.
Я надеялся, что и с sqlXmlBulkLoad есть что-то аналогичное.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40041118
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dik_68
aleks222
Что такое "ключи"?

Я про заполнение поля в дочерней таблице значением ключа из родительской.
При импорте через openrowset их тоже в xml нет, но процедура их заполняет фактически номерами строк.
Я надеялся, что и с sqlXmlBulkLoad есть что-то аналогичное.


Если в твоем ХМЛ есть "ключ" - заполнить можно. Изучай
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  <xs:annotation>
   <xs:appinfo>

    <sql:relationship name="R"
          parent="ParentTableName"
          parent-key="key"
          child="ChildTableName"
          child-key="key" 
    />

   </xs:appinfo>
  </xs:annotation>



Нет в твоем ХМЛ "ключа" - заполнить низзя.

ЗЫ. Да, правильные ХМЛ - редкость. Ибо "выгружатели" редко загружают свои творения.
...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40041332
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ.

Надеюсь, что последний вопрос.
Если для связи использую int: в родительской ([ID] [int] IDENTITY(1,1)) и дочерней ([PID] [int]), то импорт отрабатывает и поле PID заполняется, но если меняю на ([ID] [uniqueidentifier] NOT NULL DEFAULT (newid()) и ([PID] [uniqueidentifier]), то после импорта во всех записях PID=NULL
Видимо нужно где-то указать, что [PID] [uniqueidentifier], но не пойму где, т.к. в схеме оно упоминается только в блоке relationship

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<?xml version="1.0"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" >
 <xsd:annotation>
  <xsd:appinfo>
   <sql:relationship name="itmp_EXP_itmp_ZL_LIST" parent="itmp_ZL_LIST" parent-key="ID" child="itmp_EXP" child-key="PID" />
  </xsd:appinfo>
 </xsd:annotation>
    <xsd:element name="ZL_LIST" sql:relation="itmp_ZL_LIST" sql:key-fields="ID">
     <xsd:complexType>
      <xsd:sequence>
       <xsd:element name="ZGLV" sql:is-constant="1">
        <xsd:complexType>
         <xsd:sequence>
             <xsd:element name="VERSION" sql:is-constant="1" />
             <xsd:element name="DATA" sql:is-constant="1" />
             <xsd:element name="FILENAME" sql:is-constant="1" />
         </xsd:sequence>
        </xsd:complexType>
       </xsd:element>
       <xsd:element maxOccurs="unbounded" name="EXP" sql:relation="itmp_EXP" sql:relationship="itmp_EXP_itmp_ZL_LIST" sql:key-fields="ID" >
        <xsd:complexType>
         <xsd:all minOccurs="1">
	  <xsd:element minOccurs="0" name="YEAR" type="xsd:unsignedShort" sql:datatype="varchar(1000)" />
	  <xsd:element minOccurs="0" name="MONTH" type="xsd:unsignedByte" sql:datatype="varchar(1000)" />
         </xsd:all>
        </xsd:complexType>
       </xsd:element>
      </xsd:sequence>
     </xsd:complexType>
    </xsd:element>
</xsd:schema>

...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40116075
dik_68
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, есть такая XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0" encoding="windows-1251"?>
<ROOT>
  <T1>
    <P1>3</P1>
	<T2>
		<P21>12</P21>
	</T2>
	<T2>
		<P21>122</P21>
	</T2>
  </T1>
  <T1>
    <P1>31</P1>
  </T1>
</ROOT>


и схема
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
<?xml version="1.0" encoding="windows-1251"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
 <xsd:annotation>
  <xsd:appinfo>
   <sql:relationship name="FK_R_T1" parent="t_ROOT" parent-key="id" child="t_T1" child-key="pid" />
   <sql:relationship name="FK_T1_T2" parent="t_T1" parent-key="id" child="t_T2" child-key="pid" />
  </xsd:appinfo>
 </xsd:annotation>
	<xsd:element name="ROOT" sql:relation="t_ROOT" sql:key-field="id">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="T1" sql:relation="t_T1" sql:relationship="FK_R_T1" sql:key-field="id"  >
					<xsd:complexType>
						<xsd:sequence>
							<xsd:element name="P1" type="xsd:decimal" sql:datatype="decimal"/>
							<xsd:element name="T2" sql:relation="t_T2" sql:relationship="FK_T1_T2" sql:key-field="id"  >
								<xsd:complexType>
									<xsd:sequence>
										<xsd:element name="P21" type="xsd:decimal" sql:datatype="decimal"/>
									</xsd:sequence>
								</xsd:complexType>
							</xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>


Получаю необходимый результат
t_ROOT
id N
8 NULL

t_T1
pid id P1
8 15 3
8 16 31

t_T2
pid id P21
15 7 12
15 8 122

Вопрос, как изменить схему, чтобы получить этот же результат, но с измененной XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0" encoding="windows-1251"?>
<ROOT>
  <T1>
    <P1>3</P1>
	<T2>
		<P21>12</P21>
		<P21>122</P21>
	</T2>
  </T1>
  <T1>
    <P1>31</P1>
  </T1>
</ROOT>

...
Рейтинг: 0 / 0
Как вытащить данные из сложной и многоуровневой XML?
    #40116260
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак. И так сойдет.

Лучше кляузу

sql:is-constant="1"

разучи.

<xsd:element name="ROOT" sql:is-constant="1">

Целую таблицу сэкономишь.
...
Рейтинг: 0 / 0
18 сообщений из 68, страница 3 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как вытащить данные из сложной и многоуровневой XML?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]