2015-09-08 18 views
6

TLDR;SQLXML थोक एक एकल तालिका में एक विशेषता लोड करना

मैं एक्सएमएल लोड करने के लिए एसक्यूएलएक्सएमएल थोक लोडर (4.0) का उपयोग करने का प्रयास कर रहा हूं जो ऐसा कुछ दिखता है;

<?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> 

अगर मैं एक थोक लोड प्रयास करते हैं, देश के साथ-साथ, मुझे यह कहते हुए एक त्रुटि मिलती है कि 'देश' पर एक स्कीमा संबंध की उम्मीद है। हालांकि, जो कुछ भी मैं पढ़ रहा हूं, रिश्ते अलग-अलग तालिकाओं के बीच सेट होते हैं, न कि अन्य सभी डेटा के समान तालिका में विशेषताओं को आयात करने के लिए।

वैकल्पिक रूप से मैंने "देश" तत्व को "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> 

स्कीमा बच्चे:

<?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 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"] होना चाहिए। अगर मैं उस अतिरिक्त "एसक्यूएल: फ़ील्ड" नहीं डालता हूं तो मुझे यह कहते हुए एक त्रुटि मिलती है कि "कॉलम 'cwe' को स्कीमा में परिभाषित किया गया था लेकिन डेटाबेस में मौजूद नहीं है"। अगर मैं उस तत्व पर 'निरंतर' टैग जोड़ता हूं तो मुझे निरंतर तत्व में विशेषता त्रुटि नहीं मिल सकती है। तो मुझे मिला एकमात्र समाधान है कि इसे अनावश्यक रूप से एसक्यूएल असाइन करें: फ़ील्ड = "सीडब्ल्यूई"।

उत्तर

3

आपको एसक्यूएल फ़ील्ड को संबोधित करके एक साधारण सामग्री के साथ एक जटिल प्रकार की परिभाषा की आवश्यकता है।
<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

यह एक फॉलो-अप प्रश्न के बावजूद काम करता था। प्रश्न में एक्सएमएल एक सरल उदाहरण है जिसके साथ मैं काम कर रहा हूं। मेरे वास्तविक मामले में, "देश" तत्व वास्तव में एक अलग कॉलम नाम पर मैप किया गया है (कॉलम का नाम "नागरिकता" है)।मैंने विशेषता के लिए "sql: field =" नागरिकता "जोड़ा लेकिन मुझे एक त्रुटि मिली जिसमें कहा गया कि" देश "ज्ञात कॉलम नहीं है। इसलिए मैंने स्कीमा में विशेषता के अलावा "देश" तत्व में "वर्ग" फ़ील्ड = "नागरिकता" जोड़ा। क्या मैंने सही काम किया? यह उसके बाद काम करने के लिए दिखाई दिया, हालांकि अब दोनों गुण और तत्व हैं "एसक्यूएल: फ़ील्ड =" नागरिकता " – n00b

+0

@ n00b मुझे एक्सएमएल और स्कीमा फाइलों को देखने की ज़रूरत है। –

+0

कृपया मेरे अपडेट किए गए प्रश्न को देखें जिसमें प्रश्न में एक्सएमएल शामिल है। ध्यान दें कि मुझे तत्व और गुण दोनों में "sql: field =" CWE "" जोड़ना था, भले ही मैं जिस पर ध्यान रखता हूं वह विशेषता है। क्या इसे ठीक करने के लिए कोई रास्ता है या क्या आप मुझे बता सकते हैं कि क्या हो रहा है? – n00b

संबंधित मुद्दे