2017-11-30 5 views
1

スキーマに対してXMLを検証しようとしていますが、コードを実行するとエラーが発生します。 XML(sample.xmlには)次のとおりです。xmlを検証しようとすると「パラメータが正しくありません」というエラーが表示されるのはなぜですか?

<?xml version="1.0" encoding="utf-8"?> 
<Catalog xmlns:dt="urn:schemas-microsoft-com:datatypes"> 
    <Rec> 
    <ITEMS dt:dt="string"/> 
    <QTY dt:dt="string">1</QTY> 
    <CATALOG dt:dt="string">1492</CATALOG> 
    <MFG dt:dt="string">BA</MFG> 
    <ASSYCODE dt:dt="string"/> 
    <DESC dt:dt="string">MCB 1 POLE 2A TYPE C</DESC> 
    <QUERY2 dt:dt="string">1MCB</QUERY2> 
    <QUERY3 dt:dt="string">2A</QUERY3> 
    <MISC1 dt:dt="string"/> 
    <MISC2 dt:dt="string"/> 
    <USER1 dt:dt="string">EAMCB122</USER1> 
    <USER2 dt:dt="string"/> 
    <USER3 dt:dt="string"/> 
    <TABNAM dt:dt="string">CB</TABNAM> 
    <TAGS dt:dt="string">Q2-4D</TAGS> 
    <DESC1 dt:dt="string"/> 
    <DESC2 dt:dt="string"/> 
    <DESC3 dt:dt="string"/> 
    <INST dt:dt="string"/> 
    <LOC dt:dt="string"/> 
    <UM dt:dt="string"/> 
    <HDL dt:dt="string">h=6706</HDL> 
    <DWGIX dt:dt="string">7</DWGIX> 
    <REF dt:dt="string">-4D</REF> 
    <SH dt:dt="string">2</SH> 
    <SOURCE dt:dt="string">ELECTRICAL</SOURCE> 
    </Rec> 
</Catalog> 

とスキーマ(sample.xsd)は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
     <!-- XML Schema Generated from XML Document on Thu Nov 30 2017 16:39:38 GMT+0000 (GMT Standard Time) --> 
     <!-- with XmlGrid.net Free Online Service http://xmlgrid.net --> 
     <xs:element name="Catalog"> 
       <xs:complexType> 
        <xs:sequence> 
          <xs:element name="Rec" maxOccurs="unbounded"> 
           <xs:complexType> 
             <xs:sequence> 
              <xs:element name="ITEMS"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="QTY" type="xs:int"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="CATALOG" type="xs:int"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="MFG" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="ASSYCODE"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="DESC" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="QUERY2" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="QUERY3" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="MISC1"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="MISC2"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="USER1" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="USER2"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="USER3"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="TABNAM" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="TAGS" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="DESC1"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="DESC2"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="DESC3"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="INST"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="LOC"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="UM"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="HDL" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="DWGIX" type="xs:int"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="REF" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="SH" type="xs:int"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
              <xs:element name="SOURCE" type="xs:string"> 
                <xs:complexType> 
                 <xs:attribute name="dt:dt" type="xs:string"></xs:attribute> 
                </xs:complexType> 
              </xs:element> 
             </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
        </xs:sequence> 
        <xs:attribute name="xmlns:dt" type="xs:string"></xs:attribute> 
       </xs:complexType> 
     </xs:element> 
    </xs:schema> 

私はそうないはず合理的に確信してXMLファイルを使用してスキーマをオンラインで生成しましたそこに何か誤りがあります。私が使用しています VBAコードは次のとおりです。

Sub test() 

    Dim xDoc As New MSXML2.DOMDocument60 
    Dim xLists As IXMLDOMElement 


    Const dir = "C:\" 
    Dim xSchema As New MSXML2.XMLSchemaCache60 
    Dim xSchemaErr As IXMLDOMParseError 

    Call xSchema.Add("urn:schemas-microsoft-com:datatypes", LoadXML(dir & "sample.xsd")) 

    Set xDoc = LoadXML(dir & "sample.xml") 
    Set xDoc.Schemas = xSchema 

    Set xSchemaErr = xDoc.Validate 

    Set xDoc = Nothing 

End Sub 

Private Function LoadXML(strFilename As String) As MSXML2.DOMDocument60 

    Dim xDoc As New MSXML2.DOMDocument60 
    Dim bLoadSucceeded As Boolean 
    Dim fso As New FileSystemObject 

    With xDoc 
     .async = False 
     .validateOnParse = False 
     .resolveExternals = False 
    End With 

    If (fso.FileExists(strFilename)) Then 
     bLoadSucceeded = xDoc.Load(strFilename) 
     If (bLoadSucceeded) Then 
      Set LoadXML = xDoc 
     Else 
      Call MsgBox("Load XML document failed", vbCritical, "Warning") 
      Set xDoc = Nothing 
      Exit Function 
     End If 
    Else 
     Call MsgBox("Unable to find specified XML file to load", vbCritical, "Warning") 
     Set xDoc = Nothing 
     Exit Function 
    End If 

    Set xDoc = Nothing 

End Function 

問題がエラーThe parameter is incorrectとここ

Call xSchema.Add("urn:schemas-microsoft-com:datatypes", LoadXML(dir & "sample.xsd")) 

発生したが、私は、問題の原因となっているパラメータを参照することはできません。 XMLSchemaCache60というaddメソッドのドキュメントを見ると、このエラーについては何の言及も見当たりません。

誰でもこれが何であるか知っていますか?

おかげ

編集: まあ、最後の数日間、このオーバーをじっくり考えた後、私はまだ私は完全にXSDがそうほとんど役に立たないことを示唆したコメント以外のMichael Kayからのコメントを理解してわからない、など私はxmlgrid.netほどまったく役に立たない、私はもう一つ試みた。今回https://devutilsonline.com/xsd-xml/generate-xsd-from-xml、これは私が得たものである:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> 
    <xs:element name="Catalog" type="CatalogType"/> 
    <xs:complexType name="ITEMSType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="QTYType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:byte"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="CATALOGType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:short"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="MFGType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="ASSYCODEType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="DESCType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="QUERY2Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="QUERY3Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="MISC1Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="MISC2Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="USER1Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="USER2Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="USER3Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="TABNAMType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="TAGSType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="DESC1Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="DESC2Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="DESC3Type"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="INSTType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="LOCType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="UMType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="HDLType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="DWGIXType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:byte"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="REFType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:float"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="SHType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:byte"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="SOURCEType"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute xmlns:urn="urn:schemas-microsoft-com:datatypes" ref="urn:dt"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
    <xs:complexType name="RecType"> 
    <xs:sequence> 
     <xs:element type="ITEMSType" name="ITEMS"/> 
     <xs:element type="QTYType" name="QTY"/> 
     <xs:element type="CATALOGType" name="CATALOG"/> 
     <xs:element type="MFGType" name="MFG"/> 
     <xs:element type="ASSYCODEType" name="ASSYCODE"/> 
     <xs:element type="DESCType" name="DESC"/> 
     <xs:element type="QUERY2Type" name="QUERY2"/> 
     <xs:element type="QUERY3Type" name="QUERY3"/> 
     <xs:element type="MISC1Type" name="MISC1"/> 
     <xs:element type="MISC2Type" name="MISC2"/> 
     <xs:element type="USER1Type" name="USER1"/> 
     <xs:element type="USER2Type" name="USER2"/> 
     <xs:element type="USER3Type" name="USER3"/> 
     <xs:element type="TABNAMType" name="TABNAM"/> 
     <xs:element type="TAGSType" name="TAGS"/> 
     <xs:element type="DESC1Type" name="DESC1"/> 
     <xs:element type="DESC2Type" name="DESC2"/> 
     <xs:element type="DESC3Type" name="DESC3"/> 
     <xs:element type="INSTType" name="INST"/> 
     <xs:element type="LOCType" name="LOC"/> 
     <xs:element type="UMType" name="UM"/> 
     <xs:element type="HDLType" name="HDL"/> 
     <xs:element type="DWGIXType" name="DWGIX"/> 
     <xs:element type="REFType" name="REF"/> 
     <xs:element type="SHType" name="SH"/> 
     <xs:element type="SOURCEType" name="SOURCE"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="CatalogType"> 
    <xs:sequence> 
     <xs:element type="RecType" name="Rec"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

それがインポートスキーマの問題に対処したかのように見えます?????しかし、私は今、新たなエラーが出る:

sample.xsd#/schema/complexType[17][@name = 'DESC2Type']/simpleContent[1]/extension[1]/attribute[1] 
Undeclared XSD attribute : '{urn:schemas-microsoft-com:datatypes}dt'. 

これは宣言されていない属性がある理由を私は理解できない - 私には、これはちょうど別の名前ではあるが、同じドキュメント内の他の部分のように見えます!

+0

が、私は「解析エラーがあったというエラーを取得します'dt:dt'をNCNameデータ型として使用します。 (しかし、私はxmlについては何も知らないので、あなたの問題とどう関係しているのか分かりません) – YowE3K

+0

MSXMLのメソッドであるので、 'LoadXML()'の名前を変更することを強くお勧めします。 – Parfait

+0

そして 'Dir'はVBA関数です。 – YowE3K

答えて

0

スキーマは実際には無効です(つまり、あなたが選んだオンラインツールはバグです - 実際、それは駄目です)。

はまず、

<xs:attribute name="dt:dt" type="xs:string"> 

は非常に間違っています:name属性は、単純なNCNameで(無コロン名)でなければなりません。属性が包含要素と異なる名前空間にある場合、スキーマはその名前空間のための別個のスキーマ文書のxs:importを含む必要があります。属性は、インポートされたスキーマ文書で宣言され、ref属性を使用して、プライマリスキーマ文書で参照する必要があります

<xs:attribute ref="dt:dt"/> 

第二に、要素宣言はtype属性とcomplexType子要素の両方を持つことはできません。属性を持っており、また、ここで説明するように、テキストの内容が「単純なコンテンツを含む複合型」を使用している持っている要素を記述するための正しい方法:

XML Schema: Element with attributes containing only text?

私はあなたが取得しているエラーメッセージがあると言っていますかなりひどい。サクソンはあなたにフォームのメッセージのリストを与える:

形式のメッセージのリストが続く
Error at xs:attribute on line 13 column 81 of test.xsd: 
    No namespace prefix is allowed in this name {dt:dt} 

Error at xs:element on line 16 column 66 of test.xsd: 
    A <complexType> element must not appear as a child of an <xs:element> with a @type attribute 
+0

これを書いた後、私はスキーマがxmlgrid.netに起因していることに気付きました。 xmlgridによって生成された他のスキーマ。 https://stackoverflow.com/questions/17247978/how-to-validate-this-xml-input/17249033#17249033にも同じ問題があるようです。 xmlgridサイトにバグレポートを送信する方法がないので、バグが修正されない場合はおそらく驚くことではありません。 –

0

は適切にエラーが特にAPIでの作業の実行時例外をキャッチするためにあなたの方法をあなたを扱っていましたMSXMLのように、スキーマに関する問題を示すより適切なエラーメッセージが表示されます。

Sub test() 
On Error GoTo ErrHandle 
    ... 


ExitHandle: 
    Set xDoc = Nothing 
    Exit Sub 

ErrHandle: 
    MsgBox Err.Number & " - " & Err.Description, vbCritical 
    Resume ExitHandle 
End Sub 

' CHANGED FCT NAME TO AVOID NAME CLASH WITH MSXML's LOADXML()  
Private Function ProcXML(strFilename As String) As MSXML2.DOMDocument60 
On Error GoTo ErrHandle 
    ... 

ExitHandle: 
    Set xDoc = Nothing 
    Exit Function 

ErrHandle: 
    MsgBox Err.Number & " - " & Err.Description, vbCritical 
    Resume ExitHandle 
End Function 

(私は、スキーマファイルCatalogExcel.xsdの名前)ダイアログメッセージ私は、コードを実行しようとすると

Error Message

関連する問題