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

Откуда: большая деревня
Сообщений: 266
Требуется ежедневно загружать в базу xml файлы с ftp клиента. Вместо того, чтобы писать программу, решил использовать SSIS. В настройках источника данных требует указать схему XSD. В той же Visual Studio открыл мой XML и выбрал в меню сгенерировать схему. Получил три файла: основной, файл свойств и файл печати. А в пакет можно передать только один файл схемы, и при указании главного файла выдает ошибку: элемент DocumentProperties не объявлен.
Скачал редактор XML Marker 2, он сгенерировал один файл схемы. Но SSIS пакет вновь выдает ошибку
"TITLE: Microsoft Visual Studio
Ошибка в Data Flow Task [XML Source [1]]: There was an error setting up the mapping. Значение xmlns не может использоваться в качестве имени для объявления атрибута."

Я с XML ранее не работал и не представляю, что надо исправить. Во вложении сам xml и сгенерированные автоматически схемы.

К сообщению приложен файл (XML.ZIP - 4Kb) cкачать
8 сен 14, 09:10    [16547874]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Найдите какой-нибудь генератор схемы и закиньте туда ваш XML -- получите схему. В онлайне из полно. Важно, чтобы это был полный XML со всеми случаями. Возможно вам что-то потребуется дописать и проверить эту схему, но начать можно с этого.

Всякие XMLSpy и другие инструменты работы с XML вам могут быть полезны.
8 сен 14, 12:49    [16549055]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
ГуЗы
Guest
virtuOS,
В SSIS кидаешь источник XML- а он умеет сам генерить схему и сохранит ее, куда скажешь. Конечно, если исходный хml не содержит ошибок.
8 сен 14, 14:42    [16550010]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Если бы было всё так просто.
SSIS отказался генерировать схему:
TITLE: Microsoft Visual Studio
------------------------------
Не удалось вывести XSD из XML-файла. XML содержит несколько пространств имен.

Попробовал несколько программ: XMLSpy, XMLPad, editix, несколько online сервисов. Ни одну из полученных схем SSIS не принял.

PS. Пробовал в SSIS 2005. У кого под рукой есть более новая версия, можете попробовать сгенерировать схему (файлы в первом сообщении).
8 сен 14, 14:55    [16550112]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
virtuOS
Если бы было всё так просто.
SSIS отказался генерировать схему:
TITLE: Microsoft Visual Studio
------------------------------
Не удалось вывести XSD из XML-файла. XML содержит несколько пространств имен.

Попробовал несколько программ: XMLSpy, XMLPad, editix, несколько online сервисов. Ни одну из полученных схем SSIS не принял.

PS. Пробовал в SSIS 2005. У кого под рукой есть более новая версия, можете попробовать сгенерировать схему (файлы в первом сообщении).



Поправьте меня если я не прав, но схема покрывает одно пространство имён. У вас должная коллекция схем под каждое пространство.
8 сен 14, 15:11    [16550223]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
автор
У вас должная коллекция схем под каждое пространство.

Я конечно рад, что у меня должная коллекция схем, но что мне с ней делать? SSIS, как я понял, может работать только с одной схемой одновременно.

Есть другие варианты импорта в SQL или остается только писать программу?
8 сен 14, 15:26    [16550341]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
virtuOS
автор
У вас должная коллекция схем под каждое пространство.

Я конечно рад, что у меня должная коллекция схем, но что мне с ней делать? SSIS, как я понял, может работать только с одной схемой одновременно.

Есть другие варианты импорта в SQL или остается только писать программу?


Куда вы загружаете XML -- там объявлена коллекция схем на колонке?

Загрузите в текстовый буфер, затем select insert в поле с коллекцией схем.
http://msdn.microsoft.com/en-us/library/ms176009.aspx
http://msdn.microsoft.com/en-us/library/ms187856.aspx
8 сен 14, 15:33    [16550386]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
автор
Куда вы загружаете XML -- там объявлена коллекция схем на колонке?

Изначально не планировал импортировать xml в базу, а парсить SSIS и вставлять готовые данные. Но раз возникли проблемы, попробовал по вашим ссылкам.
1. создал схему
select * from sys.xml_schema_collections;

xml_collection_idschema_idprincipal_idnamecreate_datemodify_date
655391NULLIQCardXMLSchemaCollection2014-09-08 16:01:57.2302014-09-08 16:01:57.230

2. объявил переменную и залил в неё xml:
DECLARE @x xml (IQCardXMLSchemaCollection);


3. Пробую прочитать данные:

select x.t.value('@id', 'INT') as id,
		x.t.value('@card_barcode', 'INT') as card_barcode,
		x.t.value('@card_barcode', 'varchar(100)') as email
FROM @x.nodes('/Workbook/Worksheet/Table/Row') as x(t);

Сообщение 2260, уровень 16, состояние 1, строка 253
XQuery [nodes()]: There is no element named 'Workbook'
8 сен 14, 17:07    [16550997]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
virtuOS
автор
Куда вы загружаете XML -- там объявлена коллекция схем на колонке?

Изначально не планировал импортировать xml в базу, а парсить SSIS и вставлять готовые данные. Но раз возникли проблемы, попробовал по вашим ссылкам.
1. создал схему
select * from sys.xml_schema_collections;

xml_collection_idschema_idprincipal_idnamecreate_datemodify_date
655391NULLIQCardXMLSchemaCollection2014-09-08 16:01:57.2302014-09-08 16:01:57.230

2. объявил переменную и залил в неё xml:
DECLARE @x xml (IQCardXMLSchemaCollection);


3. Пробую прочитать данные:

select x.t.value('@id', 'INT') as id,
		x.t.value('@card_barcode', 'INT') as card_barcode,
		x.t.value('@card_barcode', 'varchar(100)') as email
FROM @x.nodes('/Workbook/Worksheet/Table/Row') as x(t);

Сообщение 2260, уровень 16, состояние 1, строка 253
XQuery [nodes()]: There is no element named 'Workbook'


есть конструкция WITH XMLNAMESPACES
8 сен 14, 17:55    [16551264]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Вам просто нужно научиться правильно делать XPATH к XML при наличии пространств имён

http://msdn.microsoft.com/en-us/library/ms177400.aspx

В общем хороший RTFM на эту тему вам поможет написать то, что вы хотите
8 сен 14, 17:58    [16551283]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
Перечитал несколько раз справку, но просветления так и не наступило. Что сделал:
Сделал таблицу со столбцом xml, привязал к нему схему в свойствах столбца.
Пишу:
;with XMLNAMESPACES ('urn:schemas-microsoft-com:office:spreadsheet' as ns)
select XMLData.exist('
/ns:Workbook/ns:Worksheet/ns:Table/ns:Row ')
from [dbo].[XML_Load]

Результат 1, т.е. элемент структуры существует.
Далее пробую читать данные:
;with XMLNAMESPACES ('urn:schemas-microsoft-com:office:spreadsheet' as ns)
select 
		XMLData.query('<card_barcode card_barcode="{ /ns:Workbook/ns:Worksheet/ns:Table/ns:Row/@card_barcode }" />')
from [dbo].[XML_Load]
where XMLData.exist('
/ns:Workbook/ns:Worksheet/ns:Table/ns:Row ') = 1

-- текст ошибки
--XQuery [dbo.XML_Load.XMLData.query()]: There is no attribute named '@card_barcode' in the type 'element(ns{urn:schemas-microsoft-com:office:spreadsheet}:Row,#anonymous) *'.


При этом элемент @card_barcode существует, во вложении содержимое XMLData

К сообщению приложен файл. Размер - 34Kb
9 сен 14, 10:56    [16553137]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
virtuOS,

Уважаемый, я что-то в упор не вижу у вас аттрибута @card_barcode.

/ns:Workbook/ns:Worksheet/ns:Table/ns:Row вот этот xpath у вас должен вернуть содержимое нода Row

Вот это у нас аттрибут ss:@type

/Workbook/Worksheet/Table/Row/ss:@type

А это просто содержание нода
/Workbook/Worksheet/Table/Row

Вот это содержание нода c определённым значением аттрибута
/Workbook/Worksheet/Table/Row[ss:@type = 'String']
9 сен 14, 12:55    [16553901]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Наверно всё-таки вот так @ss:type
9 сен 14, 13:00    [16553938]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить схему XLM  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
+ Намёк
declare @xml xml
set @xml = '<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>Konstantin V. Lvov</Author>
<LastAuthor>Konstantin V. Lvov</LastAuthor>
<Created>2014-09-04T10:06:40Z</Created>
<Version>14.00</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<AllowPNG/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>9945</WindowHeight>
<WindowWidth>10005</WindowWidth>
<WindowTopX>120</WindowTopX>
<WindowTopY>195</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="11"
ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s62" ss:Name="Гиперссылка">
<Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="11"
ss:Color="#0000FF" ss:Underline="Single"/>
</Style>
<Style ss:ID="s68">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
</Style>
<Style ss:ID="s69" ss:Parent="s62">
<Borders>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
<Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="11"
ss:Color="#0000FF" ss:Underline="Single"/>
</Style>
</Styles>
<Worksheet ss:Name="Table1">
<Table ss:ExpandedColumnCount="12" ss:ExpandedRowCount="2" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
<Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="110.25" ss:Span="8"/>
<Column ss:Index="11" ss:AutoFitWidth="0" ss:Width="66.75"/>
<Column ss:AutoFitWidth="0" ss:Width="77.25"/>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s68"><Data ss:Type="String">id</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">card_barcode</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">first_name</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">middle_name</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">last_name</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">sex</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">sell_date</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">birthday</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">phone_number</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">email</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">результат </Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">комментарий</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s68"><Data ss:Type="Number">24716</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="Number">2121210180000</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">Елена</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">Елена</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">Елена</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">FEMALE</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String">2014-08-23 17:20:06</Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="String"></Data></Cell>
<Cell ss:StyleID="s68"><Data ss:Type="Number">79605689000</Data></Cell>
<Cell ss:StyleID="s69" ss:HRef="mailto:alena-oook@jjjr.ru"><Data
ss:Type="String">alena-oook@jjjr.ru</Data></Cell>
<Cell ss:StyleID="s68"/>
<Cell ss:StyleID="s68"/>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Unsynced/>
<Print>
<ValidPrinterInfo/>
<PaperSizeIndex>9</PaperSizeIndex>
<HorizontalResolution>600</HorizontalResolution>
<VerticalResolution>600</VerticalResolution>
</Print>
<Selected/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>1</ActiveRow>
<ActiveCol>10</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>'

select
c.value('./*:Cell[1]/*:Data[1]','varchar(100)') as [id]
,c.value('./*:Cell[2]/*:Data[1]','varchar(100)') as [card_barcode]
,c.value('./*:Cell[3]/*:Data[1]','varchar(100)') as [first_name]
,c.value('./*:Cell[4]/*:Data[1]','varchar(100)') as [middle_name]
,c.value('./*:Cell[5]/*:Data[1]','varchar(100)') as [last_name]
,c.value('./*:Cell[6]/*:Data[1]','varchar(100)') as [sex]
,c.value('./*:Cell[7]/*:Data[1]','varchar(100)') as [sell_date]
,c.value('./*:Cell[8]/*:Data[1]','varchar(100)') as [birthday]
,c.value('./*:Cell[9]/*:Data[1]','varchar(100)') as [phone_number]
,c.value('./*:Cell[10]/*:Data[1]','varchar(100)') as [email]
,c.value('./*:Cell[11]/*:Data[1]','varchar(100)') as [результат]
,c.value('./*:Cell[12]/*:Data[1]','varchar(100)') as [комментарий]
from @xml.nodes('//*:Row') as t(c)
where c.value('./*:Cell[1]/*:Data[1]','varchar(100)') <> 'id'
9 сен 14, 13:54    [16554286]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить