Steff: XML Validierung in Oracle Datenbank schlägt fehl

Hi,

ich habe eine xmltype Tabelle deren xmltype Spalte an ein Schema gebunden ist. Wenn ich also ein xml-file reinlade wird die Datei gegen das Schema validiert. Dabei gibts aber Probleme mit den Attributen. Bei Elementen wird kein Fehler ausgespuckt. Der Fehler bei den Attributen ist "unknown attribute..."

Hier ein Auszug aus dem XML Schema von einem Element mit Attributen:

<xsd:complexType name="lic_tusers">
xsd:sequence
 <xsd:element name="lic_User" type="xsd:string" maxOccurs="unbounded" />
</xsd:sequence>
 <!-- Attributes -->
 <xsd:attribute name="lic_Created" type="xsd:string" use="required" />
 <xsd:attribute name="lic_User_ID" type="xsd:integer" use="required" />
 <xsd:attribute name="lic_Default_Tablespace" type="xsd:string" use="required" />
 <xsd:attribute name="lic_Temporary_Tablespace" type="xsd:string" use="required" />
 <xsd:attribute name="lic_Profile" type="xsd:string" use="required" />
 <xsd:attribute name="lic_Expiry_Date" type="xsd:string" use="required" />
</xsd:complexType>

Der Verweis darauf erfolgt vorher in einem Element:
<xsd:element name="lic_Users" type="lic_tusers" />

Hier ein Auszug aus dem XML DOkument:

<lic_User lic_Created="2007-10-15" lic_User_ID="73" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15">MGMT_VIEW</lic_User>
  <lic_User lic_Created="2007-10-15" lic_User_ID="0" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15">SYS</lic_User>
  <lic_User lic_Created="2007-10-15" lic_User_ID="5" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15">SYSTEM</lic_User>

Weiß jemand was da falsch läuft? Ich denke es liegt an der Definition im Schema, aber der XML-Editor gibt mir keine Fehlermeldung oder Warnung.

Wäre dankbar für Hilfe!

Gruß
Steff

  1. Hi,

    naja, der Typ lic_tusers ist als Complex Type definiert. Aber du wendest ihn im Schema für ein Element lic_Users an:

    <xsd:element name="lic_Users" type="lic_tusers" />

    Die Daten lauten aber anders

    <lic_User  attributes....>MGMT_VIEW</lic_User>

    lic_User ist aber nur _innerhalb_ von lic_tusers als simples Element definiert und kennt keinerlei Attribute.

    Deine Daten müssten so aussehen, dann wären sie gültig:

    <lic_Users lic_Created="2007-10-15" lic_User_ID="73" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15"><lic_User>MGMT_VIEW</lic_User></lic_Users>

    Warum sollte dir der XML-Editor (welcher denn überhaupt, Notepad?) eine Warnung geben? Validiert er die Daten gegen das Schema?

    Ciao, Frank

    1. Hi,

      danke fuer die Antworten! Das Schema muesste aber genau das wiedergeben was mir in dem xml dokument angegeben wird. Wie muesste das die Schema Definition aussehen? Bin am versuchen, aber hab meine Schwierigkeiten.

      Danke
      Stefan

      1. Das ist mein Ansatz dazu:

        <xsd:complexType name="lic_tusers">
          xsd:sequence
           <xsd:element name="lic_User" type="xsd:string" maxOccurs="unbounded" >
          <!-- Attributes for all the detected Users -->
            xsd:complexType
             <xsd:attribute name="lic_Created" type="xsd:string" use="required" />
             <xsd:attribute name="lic_User_ID" type="xsd:integer" use="required" />
             <xsd:attribute name="lic_Default_Tablespace" type="xsd:string" use="required" />
             <xsd:attribute name="lic_Temporary_Tablespace" type="xsd:string" use="required" />
             <xsd:attribute name="lic_Profile" type="xsd:string" use="required" />
             <xsd:attribute name="lic_Expiry_Date" type="xsd:string" use="required" />
            </xsd:complexType>
           </xsd:element>
          </xsd:sequence>
         </xsd:complexType>

        stefan

        1. Das ist mein Ansatz dazu:

          Und?

          .. wie solkar schon vermerkte, die Lösung wurde dir bereits auf nem Silberteller präsentiert.

          Ciao, Frank

      2. Hi,

        danke fuer die Antworten! Das Schema muesste aber genau das wiedergeben was mir in dem xml dokument angegeben wird. Wie muesste das die Schema Definition aussehen? Bin am versuchen, aber hab meine Schwierigkeiten.

        ???

        Ich hatte Dir bereits ein komplettes Schema gegeben.

        Grüsse

        Solkar

  2. Hier ein Auszug aus dem XML DOkument:

    Ich denk mir mal ein <lic_tusers> (Root-) Element

    <lic_User lic_Created="2007-10-15" lic_User_ID="73" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15">MGMT_VIEW</lic_User>
      <lic_User lic_Created="2007-10-15" lic_User_ID="0" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15">SYS</lic_User>
      <lic_User lic_Created="2007-10-15" lic_User_ID="5" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15">SYSTEM</lic_User>

    drumherum; dann wäre es gem. dieser xsd

    <?xml version="1.0" encoding="UTF-8"?>  
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
        <xsd:element name="lic_tusers"> <!-- Die Tabelle lic_tusers ist eine -->  
            <xsd:complexType>  
                <xsd:sequence> <!-- Sequenz der -->  
                    <xsd:element name="lic_User" maxOccurs="unbounded"> <!-- lic_User -->  
                        <xsd:complexType mixed="true">  
                            <xsd:attribute name="lic_Created" type="xsd:string" use="required" />  
                            <xsd:attribute name="lic_User_ID" type="xsd:integer" use="required" />  
                            <xsd:attribute name="lic_Default_Tablespace" type="xsd:string" use="required" />  
                            <xsd:attribute name="lic_Temporary_Tablespace" type="xsd:string" use="required" />  
                            <xsd:attribute name="lic_Profile" type="xsd:string" use="required" />  
                            <xsd:attribute name="lic_Expiry_Date" type="xsd:string" use="required" />  
                        </xsd:complexType>  
                    </xsd:element>  
                </xsd:sequence>  
            </xsd:complexType>  
        </xsd:element>  
    </xsd:schema>
    

    valide; geprüft mit xmllint aus dem libxml2 Paket

    Das hier

    <lic_User lic_Created="2007-10-15" lic_User_ID="73" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15">  
    <!-- => --> MGMT_VIEW <!-- <= -->  
    </lic_User>  
    
    

    ist dann etwas typarm, weshalb sich stattdessen

    <lic_User lic_Created="2007-10-15" lic_User_ID="73" lic_Default_Tablespace="SYSTEM" lic_Temporary_Tablespace="TEMP" lic_Profile="DEFAULT" lic_Expiry_Date="2008-11-15" lic_What_So_Ever="MGNT_VIEW" />  
    
    

    mit einem weiteren Attribut

    <xsd:attribute name="lic_What_So_Ever" type="xsd:string" use="required" />

    im inneren complexType anbietet, der dann auch nicht mehr "mixed" sein müsste.

    Weiß jemand was da falsch läuft? Ich denke es liegt an der Definition im Schema, aber der XML-Editor gibt mir keine Fehlermeldung oder Warnung.

    Wäre dankbar für Hilfe!

    Gruß
    Steff

    Gerne

    Grüsse

    Solkar