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

Откуда:
Сообщений: 4
Добрый день. Возникла проблема при создании XSD для импорта XML файла в SQL (импорт осуществляется в таблицу с именем ImportXMLStrings. В данной таблице две колонки: name, string).
Структура XML:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="kg_login_account_recovery_hint">Перейдите на страницу <b>http://</b>.</string>
    <string name="kg_login_checking_password">Проверка <li>данных</li></string>
    <string name="unlock_tip">Разблокировать</string>
</resources>


Созданная структура XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:sql="urn:schemas-microsoft-com:mapping-schema">

 <xs:element name="resources" sql:is-constant="1">
	<xs:complexType>
	  <xs:sequence>
		<xs:element maxOccurs="unbounded" name="string" sql:relation="ImportXMLStrings" sql:use-cdata="1" >
		  <xs:complexType>
			<xs:simpleContent>
			  <xs:extension base="xs:string">
				<xs:attribute name="name" type="xs:string" use="required"/>
			  </xs:extension>
			</xs:simpleContent>
		  </xs:complexType>
		</xs:element>
	  </xs:sequence>
	</xs:complexType>
 </xs:element>

</xs:schema>


Особенность импорта в том что содержимое тега "<string>" - смешанное и должно импортироваться как строка, т.е. все внутренние теги должны восприниматься как простой текст (<b>,<li>). Для этого я использую атрибут sql:use-cdata="1" в строке:
<xs:element maxOccurs="unbounded" name="string" sql:relation="ImportXMLStrings" sql:use-cdata="1" >

Но по непонятным мне причинам Bukl loader игнорирует данный атрибут.
Подскажите пожалуйста в чем может быть трабл или я в принципе что-то не так делаю.

На всякий случай импорт делаю с помощью скрипта:
        objBL = CreateObject("SQLXMLBulkLoad.SQLXMLBulkLoad")
        objBL.ConnectionString = "provider=SQLOLEDB.1;data source=1-PC\SQLEXPRESS; database=AndroidLng;uid=sa;pwd=111"
        'objBL.ErrorLogFile = "c:\error.log"
        objBL.Execute(Application.StartupPath & "\XSD\strings.xsd", "c:\strings.xml")
        objBL = Nothing


Помогите пожалуйста - весь мозг сломал.
3 июн 14, 18:14    [16114875]     Ответить | Цитировать Сообщить модератору
 Re: Импорт XML файлов  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
kosmotello
Особенность импорта в том что содержимое тега "<string>" - смешанное и должно импортироваться как строка, т.е. все внутренние теги должны восприниматься как простой текст (<b>,<li>).

kosmotello
Для этого я использую атрибут sql:use-cdata="1" в строке:
Картинка с другого сайта.

Знаете, мир не подстраивается под ваши иллюзии. Нужно понимать окружающий мир, инструменты и как они работают.
Почитайте букварь про CDATA.

В вашем XML нет никакого CDATA.
Вот пример как если бы был CDATA:
<resources>
  <string name="kg_login_account_recovery_hint"><![CDATA[Перейдите на страницу <b>http://</b>.]]></string>
  <string name="kg_login_checking_password"><![CDATA[Проверка <li>данных</li>…]]></string>
  <string name="unlock_tip"><![CDATA[Разблокировать]]></string>
</resources>

У вас неправильный XSD. Если подразумевается что внутри тега может быть любые другие теги, то это обозначается через <xsd:any>
<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:element name="resources" sql:is-constant="1">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="string" sql:relation="ImportXMLStrings">
          <xsd:complexType>
            <xsd:attribute name="name" type="xsd:string" use="required" />
            <xsd:sequence>
              <xs:any minOccurs="0"/>
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
Но провайдер не поддерживает этот элемент XSD. Но там же указано как это обойти (sql:overflow-field или xsd:anyType):
<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:element name="resources" sql:is-constant="1">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="string" sql:relation="ImportXMLStrings" sql:overflow-field="string">
          <xsd:complexType>
            <xsd:attribute name="name" type="xsd:string" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
Читайте документацию. Там всё написано.

И вот как можно закачивать XML без всяких скриптов: 12410359
3 июн 14, 21:17    [16115575]     Ответить | Цитировать Сообщить модератору
 Re: Импорт XML файлов  [new]
kosmotello
Member

Откуда:
Сообщений: 4
Спасибо огромное за указание истинного пути.
Извините возможно за глупый вопрос (я еще не силен в XML, я только учусь - поэтому некоторые вещи вгоняют в ступор), но все-же:
метка sql:overflow-field="string" - загоняет в соответствующий столбец ни только содержимое тега, но и сам родительский тег. Как-нибудь можно этого избежать?
4 июн 14, 02:05    [16116270]     Ответить | Цитировать Сообщить модератору
 Re: Импорт XML файлов  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
kosmotello
sql:overflow-field="string" - загоняет в соответствующий столбец ни только содержимое тега, но и сам родительский тег. Как-нибудь можно этого избежать?
При этот подходе скорее никак, таков механизм. Можете исследовать xsd:anyType.

Что я вам скажу, я эти варианты не использовал. Не пришлось.
Используйте не данные в голове (такое знаниями не назовёшь), а логику и понимание.

автор
я только учусь
Ссори, не заметил. В чём проявилось это обучение?
Читали доки, делали эксперименты?
4 июн 14, 17:41    [16121272]     Ответить | Цитировать Сообщить модератору
 Re: Импорт XML файлов  [new]
kosmotello
Member

Откуда:
Сообщений: 4
Mnior
В чём проявилось это обучение?
Читали доки, делали эксперименты?


Да читал доки и неделю экспериментировал с различными Xsd схемами - пока не трогал смешанное содержимое все работало отлично.
Вообще это мое первое знакомство с XML и Xsd и как оказалось начал я с сокращенного синтаксиса, а надо было начинать с полного.

Спасибо огромное буду мучить anyType
4 июн 14, 19:58    [16122203]     Ответить | Цитировать Сообщить модератору
 Re: Импорт XML файлов  [new]
kosmotello
Member

Откуда:
Сообщений: 4
Еще раз спасибо огромное за волшебный пинок в правильном направлении.

Поставленную задачу решил.

Если кому пригодится то вот синтаксис работающего XSD (при решении проблемы через anyType - важно выставить метку sql:datatype="xml" на тот элемент - который должен импортироваться включая все вложенные теги):
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xs:element name="resources" sql:is-constant="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="string" sql:relation="stri"  sql:datatype="xml" >
          <xs:complexType>
            <xs:attribute name="name" type="xs:string"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


Если кому-то непонятно где здесь anyType, то вот более полный синтаксис той-же схемы:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xs:element name="resources" sql:is-constant="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="string" sql:relation="stri"  sql:datatype="xml" >
          <xs:complexType>
            <xs:complexContent>
              <xs:restriction base="xs:anyType">
                <xs:attribute name="name" type="xs:string"/>
              </xs:restriction>
            </xs:complexContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
5 июн 14, 02:11    [16123537]     Ответить | Цитировать Сообщить модератору
 Re: Импорт XML файлов  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Картинка с другого сайта.
5 июн 14, 14:06    [16126041]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить