2015-09-08 2 views
6

TLDR;SQLXML Массовая загрузка атрибута в одну таблицу

Я пытаюсь использовать SQLXML Bulk Loader (4.0) для загрузки XML, который выглядит примерно так:

<?xml version = "1.0" encoding = "UTF-8"?> 
<CarSales> 
<Client> 
    <ID >3</ID> 
    <ClientName>John Smith3</ClientName> 
    <Country name="Colombia"/> 
</Client> 
<Client> 
    <ID>7</ID> 
    <ClientName>Slow Sid</ClientName> 
    <Country name="Bolivia"/> 
</Client> 
<Client> 
    <ID>10</ID> 
    <ClientName>Missing Town</ClientName> 
    <Country name="Argentina"/> 
</Client> 
</CarSales> 

Я хочу, чтобы имя атрибута Страны быть захваченным в колонке таблицы только я использую («Client_XMLBulkLoad», который также держит имя клиента и идентификатор). Это возможно?


Подробнее:

Вот то, что я до сих пор для соответствующего XSD (с "Страна" закомментированного)

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql = "urn:schemas-microsoft-com:mapping-schema"> 
<xsd:element name = "CarSales" sql:is-constant = "1" > 
    <xsd:complexType> 
    <xsd:sequence> 
    <xsd:element name = "Client" sql:relation="Client_XMLBulkLoad" 
      maxOccurs = "unbounded"> 
     <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name = "ID" type = "xsd:integer" 
        sql:field = "ID" /> 
     <xsd:element name = "ClientName" type = "xsd:string" 
        sql:field = "ClientName" /> 
     <!-- <xsd:element name="Country" minOccurs="0" maxOccurs="unbounded"> 
       <xsd:complexType> 
        <xsd:attribute name="name" type="xsd:string" sql:field = "Country" /> 
       </xsd:complexType> 
     </xsd:element> --> 
     </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
    </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

Если я пытаю насыпной груз, со страной as-is, я получаю сообщение об ошибке, что отношения «схемы» ожидаются в «Страна». Однако во всем, что я читаю, отношения устанавливаются между разными таблицами, а не для импорта атрибутов в той же таблице, что и все другие данные.

В качестве альтернативы я попытался маркировать элемент «Страна» флагом «is-constant =» 1 », но это приводит к ошибке, указывающей, что« постоянный/фиксированный элемент не может иметь атрибуты ».

Как я могу получить название страны, когда она принадлежит в той же таблице, что и имена клиентов и идентификаторы?


Вот фактическая схема я использую (это вложенная схема)

схемы корень:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="NewDataSet" targetNamespace="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns:mstns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:app1="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
    <xs:import namespace="http://scap.nist.gov/schema/vulnerability/0.4" schemaLocation="DELTE_app1.xsd" /> 
    <xs:element name="nvd" sql:is-constant = "1"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="entry" minOccurs="0" maxOccurs="unbounded" sql:relation="NVD.CVE"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="app1:cwe" minOccurs="0"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Schema ребенок:

<?xml version="1.0" standalone="yes"?> 
<xs:schema targetNamespace="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:mstns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:app2="http://cpe.mitre.org/language/2.0" xmlns:app3="http://scap.nist.gov/schema/cvss-v2/0.2" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
    <xs:element name="cwe" msdata:Prefix="vuln" sql:field="CWE"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="id" form="unqualified" type="xs:string" sql:field="CWE"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

XML файл Я Погрузка:

<?xml version='1.0' encoding='UTF-8'?> 
<nvd xmlns:scap-core="http://scap.nist.gov/schema/scap-core/0.1" xmlns:cvss="http://scap.nist.gov/schema/cvss-v2/0.2" xmlns:vuln="http://scap.nist.gov/schema/vulnerability/0.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:patch="http://scap.nist.gov/schema/patch/0.1" xmlns="http://scap.nist.gov/schema/feed/vulnerability/2.0" xmlns:cpe-lang="http://cpe.mitre.org/language/2.0" nvd_xml_version="2.0" pub_date="2015-07-10T03:00:00" xsi:schemaLocation="http://scap.nist.gov/schema/patch/0.1 http://nvd.nist.gov/schema/patch_0.1.xsd http://scap.nist.gov/schema/feed/vulnerability/2.0 http://nvd.nist.gov/schema/nvd-cve-feed_2.0.xsd http://scap.nist.gov/schema/scap-core/0.1 http://nvd.nist.gov/schema/scap-core_0.1.xsd"> 
<entry id="CVE-2015-0016"> 
    <vuln:cwe id="CWE-22"/> 
    </entry> 
</nvd> 

Обратите внимание, что это работает, НО мне нужно иметь [sql: field = "CWE"] как на уровне элемента, так и на уровне атрибута. Если я не помещу это дополнительное «sql: field», я получаю сообщение об ошибке: «значение« cwe »столбца было определено в схеме, но не существует в базе данных». Если я добавлю тег 'is constant' на этот элемент, то я получаю, что константный элемент не может содержать ошибку атрибута. Поэтому единственным решением, которое я нашел, является избыточное присвоение ему sql: field = "CWE".

ответ

3

Вам необходимо определить сложное определение с помощью простого содержимого, обратившись к полю sql.
Посмотрите на <xsd:simpleContent> Element и <xsd:extension> Element (complexContent).
Я не тестировал, но следующая схема должна работать.
Обновление: Я протестировал только сейчас, он работает так, как ожидалось.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> 
    <xsd:element name="CarSales" sql:is-constant="1"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Client" sql:relation="Client_XMLBulkLoad" maxOccurs="unbounded"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="ID" type="xsd:integer" sql:field="ID"/> 
       <xsd:element name="ClientName" type="xsd:string" sql:field="ClientName"/> 
       <xsd:element name="Country" minOccurs="0" maxOccurs="unbounded"> 
       <xsd:complexType> 
        <xsd:simpleContent> 
        <xsd:extension base="xsd:string"> 
         <xsd:attribute name="name" type="xsd:string" sql:field="Country"/> 
        </xsd:extension> 
        </xsd:simpleContent> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 
+0

Это сработало хотя бы один вопрос. XML в вопросе является упрощенным примером того, с чем я работаю. В моем фактическом случае элемент «Страна» фактически сопоставлен с другим именем столбца (столбец называется «Гражданство»).Я добавил «sql: field =« Гражданство »в атрибут, но я получил сообщение об ошибке« Страна »не является известным столбцом. Поэтому я добавил «sql: field =« Гражданство »в элемент« Страна », в дополнение к атрибуту в схеме. Правильно ли я сделал? Кажется, что он работает после этого, хотя теперь и атрибут, и элемент имеют "sql: field =" Гражданство " – n00b

+0

@ n00b Мне нужно увидеть файлы xml и schema. –

+0

, пожалуйста, посмотрите мой обновленный вопрос, который включает в себя XML в вопросе. Обратите внимание, что мне пришлось добавить «sql: field =« CWE »« как к рассматриваемому элементу, так и по атрибуту, хотя все, что мне нужно, это атрибут. Есть ли способ исправить это или вы можете сказать мне, что происходит? – n00b

Смежные вопросы