2017-09-28 2 views
0

J'essaie de charger un énorme fichier xml sur db en utilisant le chargeur en bloc sqlxml. Pour ce faire, nous devons mettre à jour le fichier de schéma. Voici le fichier de schéma:Le schéma xsd ne traite pas correctement le fichier xml

<?xml version="1.0" ?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:sql="urn:schemas-microsoft-com:mapping-schema" 
      xmlns="http://www.eagleinvsys.com/2011/EagleML-2-0" > 

    <xsd:element name="EagleML" 
       xsi:type="WarehouseTransactionMessage" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

       sql:is-constant="1" > 
    <xsd:complexType > 
     <xsd:sequence> 
    <!--<xsd:element name="header" sql:is-constant="1" /> 
    <xsd:element name="taskIdentifier" sql:is-constant="1" />--> 
    <xsd:element name="warehouseTransaction" sql:is-constant="1"> 
    <xsd:complexType > 
    <xsd:sequence> 
     <xsd:element name="warehouseOpenLot" sql:relation="TEST" > 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="accountingBasis" type="xsd:string" /> 
       </xsd:sequence> 
       <!--<xsd:attribute name="accruedLtdBase" type="xsd:decimal" /> 
      <xsd:attribute name="accruedLtdLocal" type="xsd:decimal" />--> 
      <!--<xsd:attribute name="xrateLocalBase" type="xsd:decimal" />--> 
      <!--<xsd:attribute name="buySellFlag" type="xsd:normalizedString" /> 
      <xsd:attribute name="closeTipsIncomeLtdBase" type="xsd:decimal" />--> 
     </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

et voici le fichier xml

<EagleML 
eaglemlVersion="2-0" 
eaglemlType="WarehouseTransactionMessage" 
eaglemlRevision="263" 
xsi:schemaLocation="http://www.eagleinvsys.com/2011/EagleML-2-0 eagleml-main-2-0.xsd" 
xsi:type="WarehouseTransactionMessage" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.eagleinvsys.com/2011/EagleML-2-0" 
> 
    <header> 
    <messageId>B70JFJ55EE9AVXOX</messageId> 
    <sentBy>http://www.eagleinvsys.com/</sentBy> 
    <creationTimestamp>2017-09-25T08:25:54-04:00</creationTimestamp> 
    </header> 
    <taskIdentifier> 
    <correlationId>JFJ55EE9TARJH009</correlationId> 
    <sequenceNumber>1</sequenceNumber> 
    </taskIdentifier> 
    <warehouseTransaction> 
     <header> 
     <objectType>WarehouseOpenLot</objectType> 
     </header> 
     <warehouseOpenLot> 
     <accountingBasis>USTAX</accountingBasis> 
     </warehouseOpenLot> 
     <warehouseOpenLot> 
     <accountingBasis>TESTT</accountingBasis> 
     </warehouseOpenLot> 
    </warehouseTransaction> 
    </EagleML> 

si si laisser ces balises off, il fonctionne très bien, mais je n'ai pas le luxe de le faire:

xsi:schemaLocation="http://www.eagleinvsys.com/2011/EagleML-2-0 eagleml-main-2-0.xsd" 
xsi:type="WarehouseTransactionMessage" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.eagleinvsys.com/2011/EagleML-2-0" 

Qu'est-ce que je fais de mal ici? J'ai essayé de déplacer ces balises dans l'élément EagleML mais je semble toujours ne rien obtenir. Est-ce que quelqu'un voit l'erreur dans ceci?

Répondre

0

Un schéma décrit le vocabulaire XML d'un espace de noms particulier. S'il n'y a pas d'attribut targetNamespace dans le schéma, il décrit un vocabulaire sans espace de noms. Votre document d'instance a la déclaration d'espace de noms xmlns = "http://www.eagleinvsys.com/2011/EagleML-2-0", qui place EagleML et tous ses enfants/descendants dans cet espace de noms, ce qui n'est pas le cas. targetNamespace du schéma. Sans connaître les spécifications de EagleML, je ne sais pas si c'est le schéma ou le document d'instance qui est faux, mais je peux vous dire qu'ils ne correspondent pas. La solution la plus simple consiste à ajouter un attribut targetNamespace à l'élément xs: schema.