Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
aleks2
Guest |
Хочу загрузить sqlXmlBulkLoad XML-файл Login_Response.xml
Схему нарисовал loginSchema.xsd
Загружалка
Облом в том что данные в таблицу не грузятся. Я догадываюсь, что нужно какое-то волшебство с xmlns... но если честно - я уже запутался в этих пространствах имен. |
|||
20 фев 16, 19:25 [18847493] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ладно, в интернете есть все. Есть и примеры сложно сочиненных схем. Вот два любопытных источника по теме: http://www.execsql.com/post/category/sql-xml-bulk-load https://www.liquid-technologies.com/xml-schema-tutorial/xsd-namespaces В первом пример попроще рассмотрен. Частично его удалось запустить
!!! и это РАБОТАЕТ! Однако полный пример - не желает запускаться. Конечно, это уже не так важно - мне частичного хватит. Но досадно же.
Schema mapping: Schema: cannot infer default mapping for 'UBLVersionID'. Neither it nor any of its ancestors defines a relation. Может кого осенит что тут не так? |
||
21 фев 16, 12:58 [18848939] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ну вот, рабочая схема для загрузки xml из первого поста.
|
|
22 фев 16, 05:32 [18850386] Ответить | Цитировать Сообщить модератору |
andrey odegov Member Откуда: Сообщений: 473 |
ну да, xs:import выбор профессионалов :) loginr.xsd
|
||
22 фев 16, 14:27 [18851050] Ответить | Цитировать Сообщить модератору |
andrey odegov Member Откуда: Сообщений: 473 |
aleks2, почему vbscript, а не powershell (или c#), например? |
22 фев 16, 22:06 [18852269] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Этож для примеру. В жизни гружу powershell-ом. ЗЫ. А на C# у мя идиосинкразия. ЗЗЫ. Извини, я не уловил сути усовершенствований в твоем варианте. Окромя выкидывания одной схемы "за ненадобностью". |
||
23 фев 16, 07:26 [18852839] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Лучше подскажи: я вот пытаюсь туды identity присобачить... А оно соспротивляется: load.vbs(12, 1) General operational error: No data was provided for column 'ID' on table '[xml_alean_login]', and this column cannot contain NULL values. CREATE TABLE [dbo].[xml_alean_login]( [OverflowColumn] [ntext] NULL, [return] [nvarchar](256) NULL, [SessionID] [nvarchar](256) NULL, [ID] [int] IDENTITY(1,1) NOT NULL, PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] <xsd:schema xmlns="urn:webservice-electrasoft-ru:types-ewsServerIntf-IewsServer" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:NS2="urn:webservice-electrasoft-ru:types-ewsServerIntf" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" xmlns:msd="urn:schemas-microsoft-com:xml-msdata" targetNamespace="urn:webservice-electrasoft-ru:types-ewsServerIntf-IewsServer" elementFormDefault="unqualified" attributeFormDefault="qualified" > <xsd:import schemaLocation="ewsServerIntf.xsd" namespace="urn:webservice-electrasoft-ru:types-ewsServerIntf" /> <xsd:element name="LoginResponse" sql:relation="[xml_alean_login]" sql:overflow-field="OverflowColumn" > <xsd:complexType> <xsd:sequence> <xsd:element name="return" type="NS2:TewsLoginResult" minOccurs="1" maxOccurs="1" sql:datatype="nvarchar(256)" sql:field="[return]" /> <xsd:element name="SessionID" type="xsd:string" minOccurs="0" maxOccurs="1" sql:datatype="nvarchar(256)" /> </xsd:sequence> <xsd:attribute name="ID" type="xsd:int" sql:field="ID" sql:identity="ignore" msd:AutoIncrement="1" msd:ReadOnly="1"/> </xsd:complexType> </xsd:element> </xsd:schema> |
23 фев 16, 07:49 [18852848] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
С identity я разобрался objBL.KeepIdentity = False и фсе хоккей. Новый проблем. Иногда с сервера прилетает ответ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>as_InvalidSessionID</faultstring> <faultactor/> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope> И его тоже надо сунуть в базу. Дописываем схему и... облом. Все содержимое поля Fault попадает в OverflowColumn. Обидно, да? Вопщем то понятно - unqualified элементы. Но хоцца, хотя бы, запихнуть их неразобранным XML в поле и ID приделать. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS1="urn:webservice-electrasoft-ru:types-ewsServerIntf-IewsServer" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/" elementFormDefault="qualified" > <xsd:import schemaLocation="IewsServer.xsd" namespace="urn:webservice-electrasoft-ru:types-ewsServerIntf-IewsServer" /> <xsd:element name="Envelope" sql:is-constant="1"> <xsd:complexType> <xsd:sequence> <xsd:element name="Body" minOccurs="1" maxOccurs="1" sql:is-constant="1" > <xsd:complexType> <xsd:sequence> <xsd:element ref="NS1:LoginResponse"/> <xsd:element name="Fault" minOccurs="0" maxOccurs="1" sql:relation="[xml_alean_fault]" sql:key-fields="ID" sql:overflow-field="OverflowColumn" > <xsd:complexType> <xsd:sequence> <xsd:element name="faultcode" type="xsd:string" minOccurs="1" maxOccurs="1" sql:datatype="nvarchar(256)"/> <xsd:element name="faultstring" type="xsd:string" minOccurs="1" maxOccurs="1" sql:datatype="nvarchar(256)"/> <xsd:element name="faultactor" type="xsd:string" minOccurs="1" maxOccurs="1" sql:datatype="nvarchar(256)"/> </xsd:sequence> <xsd:attribute name="ID" type="xsd:int" default="-1" sql:identity="ignore" /> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> |
23 фев 16, 19:07 [18854495] Ответить | Цитировать Сообщить модератору |
andrey odegov Member Откуда: Сообщений: 473 |
aleks2, а где в крайнем xml-файле LoginResponse? Или Fault добавляется с неопределенными значениями для его елементов? про ЗЗЫ: нет. вчера почему-то не обрабатывался атрибут "SOAP-ENC:encodingStyle" без <xs:anyAttribute processContents="skip"/>, а сегодня-ок. |
23 фев 16, 22:02 [18855143] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
LoginResponse там отсутствует. И это правильно. Грузить файл это не мешает. Там получается ДВЕ таблицы xml_alean_logon xml_alean_fault Нет LoginResponse - ничо не грузится в xml_alean_logon. Fault имеет вполне четкую структуру - она полностью присутствует в примере. |
||
24 фев 16, 05:48 [18855705] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Лучшее - враг хорошего. Решил еще усовершенствовать. Ну и опять грабли
Чего у меня bodyID в alean_login не заполняется? |
|
24 фев 16, 12:31 [18856614] Ответить | Цитировать Сообщить модератору |
andrey odegov Member Откуда: Сообщений: 473 |
На сообщение "сегодня, 05:48" login.xml
|
|||||
24 фев 16, 19:34 [18859278] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Так же я вечно буду совершенствовать. Я ужо закинул fault как XML-поле и успокоился. А тут, оказывается, можно и разобрать... |
25 фев 16, 05:29 [18860197] Ответить | Цитировать Сообщить модератору |
andrey odegov Member Откуда: Сообщений: 473 |
Bulkload does not understand xsd:choice,xsd:group |
26 фев 16, 07:20 [18865494] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Не, я тебе очень признателен за помощь, но эту ссылку я не понял: к чему она? Ну и очередной вопрос: Вот ответ сервера. Как видно, он шлет данные строкой. Это конечно XML, но экранированный. Я могу забросить строку на сервер и разобрать там. НО! Внимание вопрос: Есть какое народное средство превратить экранированный XML в нормальный? Powershell-ом.
|
|||
26 фев 16, 09:27 [18865727] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Oops! Движок форума понимает. Но в ответе вот так: <return xsi:type="xsd:string"> |
26 фев 16, 09:30 [18865742] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Чорт! <return xsi:type="xsd:string"> Всюду вместо <> & lt; & gt; </return> |
26 фев 16, 09:33 [18865753] Ответить | Цитировать Сообщить модератору |
andrey odegov Member Откуда: Сообщений: 473 |
Но если или LoginResponse, или Fault, то без choice никак. А group за компанию попал. |
|||||
26 фев 16, 23:39 [18870148] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Я, видимо, про это не знал. Поэтому у мя все грузится или/или. |
||
27 фев 16, 05:37 [18870623] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Схемы. Там даже немножко больше теперь грузится - еще и logout.
Меня щас больше быстрое потоковое преобразование "экранированный XML" -> "нормальный XML". Непотоковое я нашел [System.Web.HttpUtility]::HtmlDecode. Но хочется правильно сделать. |
|
27 фев 16, 06:10 [18870631] Ответить | Цитировать Сообщить модератору |
andrey odegov Member Откуда: Сообщений: 473 |
как-то так
|
|
27 фев 16, 08:41 [18870687] Ответить | Цитировать Сообщить модератору |
andrey odegov Member Откуда: Сообщений: 473 |
ёлы-палы К сообщению приложен файл (return.ps1 - 2Kb) cкачать ![]() |
27 фев 16, 08:43 [18870688] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Да. Круто. Только слишком круто. Мне не надо вытаскивать содержимое экранированного XML. Практичнее конвертнуть весь файл (т.е. прямо внутри). А потом загрузить bulkload-ом. |
||
29 фев 16, 06:21 [18875571] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Вопщем, я пока сваял так$StreamWriter = [System.IO.StreamWriter] "GetHotelDetailList.xml.xml" [System.Web.HttpUtility]::HtmlDecode( [IO.File]::ReadAllText("GetHotelDetailList.xml"), $StreamWriter ) $StreamWriter.Close() Оно, конечно, работает... но непотоково это. Абидно. |
29 фев 16, 10:32 [18875979] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Еще один затык <HotelList xmlns="urn:schemas-som-ru:tws-reservationHotelDetailList">. Вроде оно все "как раньше"
рисуем схему GetData1.xsd
ItwsReservationService1.xsd
HotelList.xsd
И не грузится. Если удалить в данных <HotelList xmlns="urn:schemas-som-ru:tws-reservationHotelDetailList"> схему xmlns="urn:schemas-som-ru:tws-reservationHotelDetailList" и перенести содержисое HotelList.xsd в ItwsReservationService1.xsd все начинает работать. Но хочется ведь без таких фокусов. |
||||
1 мар 16, 05:42 [18880240] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |