Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Перенести данные из xml файла в базу данных


Автор: Mirapurr 26.11.2019, 10:11
Здравствуйте, мне нужно перенести данные из xml файла в таблицу базы данных. Структура xml файла такая:
Код

-<licenses_list>
-<licenses>
<name>Имя</name>
<activity_type>Деятельность</activity_type>
<full_name_licensee>Длинное имя</full_name_licensee>
<address>Адрес</address>
 
-<work_address_list>
-<address_place>
<address>Другой адрес</address>
<index>Индекс</index>
<region>Регион</region>
<city>Город</city>
 
-<works>
<work>Услуги 1</work>
<work>Услуги 2</work>
</works>
</address_place>
-<address_place>
<address>Другой адрес</address>
<index>Индекс</index>
<region>Регион</region>
<city>Город</city>
 
-<works>
<work>Услуги 1</work>
<work>Услуги 2</work>
</works>
</address_place>
 

-</licenses>
-</licenses_list>

Я создала таблицу с такими полями. И использовала вот такой скрипт
Код

DECLARE @S VARCHAR(MAX);
DECLARE @xml xml;
SELECT @xml = 
CONVERT(xml, BulkColumn, 2) 
FROM OPENROWSET(BULK 'адрес.xml', SINGLE_BLOB) AS x
SET @S = '<?xml version="1.0" encoding="windows-1251"?>' + CONVERT(VARCHAR(MAX),@xml)
 
DECLARE @idoc INT
EXEC sp_xml_preparedocument @idoc OUTPUT, @S
 
TRUNCATE TABLE [dbo].[test1]
INSERT INTO [dbo].[test1]
    ([name]
      ,[activity_type]
      ,[full_name_licensee]
      ,[address]
      ,[INDEX]
      ,[region]
      ,[city]
      ,[WORK]
SELECT
     CASE 
       WHEN name = '' THEN NULL
       ELSE name
     END name
      ,CASE 
       WHEN activity_type = '' THEN NULL
       ELSE activity_type
     END activity_type
      ,CASE 
       WHEN full_name_licensee = '' THEN NULL
       ELSE full_name_licensee
     END full_name_licensee
 ,CASE 
       WHEN address = '' THEN NULL
       ELSE address
     END address
,CASE 
       WHEN [INDEX] = '' THEN NULL
       ELSE [INDEX]
     END [INDEX]
      ,CASE 
       WHEN region = '' THEN NULL
       ELSE region
     END region
     ,CASE 
       WHEN city = '' THEN NULL
       ELSE city
     END city
,CASE 
       WHEN [WORK] = '' THEN NULL
       ELSE [WORK]
     END [WORK]
FROM OPENXML (@idoc,'/licenses_list/licenses')
WITH ([name] [VARCHAR](128) 'name',
    [activity_type] [VARCHAR](128) 'activity_type',
    [full_name_licensee] [VARCHAR](254) 'full_name_licensee',
[address] [VARCHAR](254) 'address',
    [INDEX] [INT] 'index',
    [region] [VARCHAR](128) 'region',
    [city] [VARCHAR](128) 'city',
    [WORK] [VARCHAR](254) 'work'

Таким образом к сожалению в таблицу заполняются только данные до тега <work_address_list>
Мне нужно, чтобы все строки таблицы были заполнены. А так получается, что строки с тегом <work> не заполняются.
Делала разными селектами, но тогда появлялись отдельные записи, где везде пустые значения и только поле work заполнено. А нужно чтобы как то связывались поля. и имя выходило (и остальные данные) для каждого work
Постаралась объяснить понятно, надеюсь вы мне подскажете

Я пробовала в режиме разработчика в excel перевести файл, а потом загружать из excel в бд. Но такой способ подходит только для небольших файлов. Мне же нужно, чтобы работало с большим объемом данных.

Автор: diadiavova 26.11.2019, 10:27
Mirapurr, вообще вопрос как бы не совсем по хмл, скорее по базам данных или инструментам мэппинга данных. Если вопрос именно об инструментах, то вот, например есть у альтовы такой
https://www.altova.com/mapforce
Если интересуют бесплатные, то можно поискать так
https://www.google.com/search?newwindow=1&client=firefox-b-d&sxsrf=ACYBGNSbLZAwa5SaK9GafJJMXqhz59MS1w%3A1574752767996&ei=_9HcXaq6PMWSmwXI2JSICA&q=data+mapping+tools+free&oq=data+mapping+tools+&gs_l=psy-ab.3.0.0i203l6j0i22i30l4.117774.131326..132820...0.2..0.106.1572.21j1......0....1..gws-wiz.......0i71j0j35i39i19j35i39j0i20i263j35i304i39j0i7i30j0i8i7i30j0i7i5i30j0i67j0i30.Gi1ktSci9Ek
Если вопрос в том, как это сделать посредством SQL, то видимо надо спрашивать в разделе, посвященном той DB-платформе, с которой работаешь. Ну, а если речь о программном решении, то в разделе соответствующего языка программирования.
Чисто XML-решением можно было бы назвать решение, в котором используемая СУБД умеет импортировать данные из хмл, но требуется другой формат хмл, в этом случае можно было трансформировать исходный файл с помощью XSLT или XQuery.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)