[XML Schema] Multiple namespace - type als ns:QNAME?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 18-04 23:52
Ik probeer in mijn XML Schema, waarbij ik gebruik maak van meerdere namespaces, binnen een geimporteerd namespace een element in te voegen door gebruik te maken van een gedefinieerde complexType. Mijn validator (PHP) blijft echter zeuren dat dit niet mag. Via een ref="ns:ELMNAME" werkt wel, maar de type niet. Op geen enkele manier heb ik het idee.

Hieronder een deel van mijn bronbestanden:
hoofd xsd:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<xs:schema xmlns="http://www.sove.nl/ns/core/" xmlns:mysql="http://www.sove.nl/ns/system/mysql/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.sove.nl/ns/core/">
    
    <!-- ## SYSTEM ## //-->
    <xs:import namespace="http://www.sove.nl/ns/system/mysql/" schemaLocation="http://www.sove.nl/ns/system/mysql.xsd"/>

    <xs:element name="stream">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="mysql:set"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

Een gedeelte van de geimporteerde XSD (mysql.xsd):
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns="http://www.sove.nl/ns/system/mysql/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.sove.nl/ns/system/mysql/">
    

    <xs:element name="set">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="query" type="query"/>
            </xs:sequence>                  
        </xs:complexType>
    </xs:element>


    <xs:complexType name="query">
        <xs:sequence>
            <xs:element name="table" type="table" minOccurs="1" />
        </xs:sequence>
    </xs:complexType>

              [...]
</xs:schema>

Ik heb ook al geprobeert:

type="mysql:query"
De empty namespace veranderd in xmlns:mysql
Empty namespace én xmlns:mysql

En alle variaties erop.

Misschien dat mijn PHP code nog relevant is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    $library = new SchemaDOMDocument("1.0"); 
    $library->validateOnParse = true; 
    
    $library->load('source.xml'); 
    $library->validateXMLSchemas(); 
    
    class SchemaDOMDocument extends DOMDocument 
    { 
        public function validateXMLSchemas() 
        { 
            $schemaLocation = $this->documentElement->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation'); 
    
            if (! $schemaLocation) { 
                throw new DOMException('No schemas found'); 
            } 
    
            /* the schemaLocation contains pairs of values separated by spaces the first value in each pair 
               is the name space to be validated. The second is a URI defining the location of the schema 
               
               validate each namespace using the provided URI 
             */ 
    
             $pairs = preg_split('/\s+/', $schemaLocation); 
             $pairCount = count($pairs); 
             
             if ($pairCount <= 1) { 
                 throw new DOMException('Invalid schema location value.'); 
             } 
    
             $valid = true; 
             for($x = 1; $x < $pairCount; $x+=2) { 
                 $valid = $this->schemaValidate($pairs[$x]) && $valid; 
             } 
             
             if(! $valid) { 
                 throw new DOMException('XML Schema Validation Failure'); 
             } 
    
             return true; 
        } 
    }


Kan iemand mij vertellen hoe het wel moet? Ik heb al tientallen examples uit Google bekeken, vele op een andere manier dan de vorige, maar geen van alle lijkt te werken. Moet toch iemand zijn die dit eerder heeft gedaan?

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 18-04 23:52
Voorbeeld van een foutmelding:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Warning: DOMDocument::schemaValidate() [function.DOMDocument-schemaValidate]: 
Validation failed: 
no DTD found !Element 
'{http://www.sove.nl/ns/system/mysql/}table': 
This element is not expected. Expected is 
( table ). 
in /var/www/client/sove.nl/httpdocs/xmysql_mysql.php on line 34


Fatal error: Uncaught exception 'DOMException' with message 
'XML Schema Validation Failure' 
in /var/www/client/sove.nl/httpdocs/xmysql_mysql.php:38 


Stack trace: #0 /var/www/client/sove.nl/httpdocs/xmysql_mysql.php(7): 
SchemaDOMDocument->validateXMLSchemas() 
#1 {main} thrown 
in /var/www/client/sove.nl/httpdocs/xmysql_mysql.php on line 38

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 07:10

Gerco

Professional Newbie

Aan die melding te zien verwacht hij het element "table" en niet mysql:table, zoals in je Xml lijkt te staan. In je XSD staat dat ook "<xs:element name="table" type="table" minOccurs="1" />". Als je dat type veranderd naar "mysql:table" zou het wel moeten werken.

Let erop dat je alle types van elementen moet kwalificeren met de namespace van dat element, als je in je xsd dus een bepaalde targetNameSpace gebruikt, zul je types die zijn daarin zijn gedefinieerd en waaraan je refereert binnen diezelfde xsd alsnog gekwalificeerd moeten worden met hun namespace.

Vaak zie je zoiets:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://example.com/somenamespace"
  xmlns:tns="http://example.com/somenamespace">
    
    <!-- de volledige naam van dit type is nu dus (http://example.com/somenamespace, set).
         Je kan eraan refereren met tns:set, omdat de prefix "tns" aan dezelfde 
         namespace gebonden is als de targetNameSpace van deze xsd -->
    <xs:element name="set">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="query" type="tns:query"/>
            </xs:sequence>                    
        </xs:complexType>
    </xs:element>

    <!-- Dit type is dus aan te spreken als tns:query -->
    <xs:complexType name="query">
        <xs:sequence>
            <xs:element name="table" type="tns:table" minOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    <!-- De definitie van table, etc is weggelaten -->
</xs:schema>

[ Voor 12% gewijzigd door Gerco op 31-03-2008 19:09 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 18-04 23:52
Probleem is dus dat dat niet werkt:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:mysql="http://www.sove.nl/ns/system/mysql/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.sove.nl/ns/system/mysql/">
    

    <xs:element name="set">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="query" type="mysql:query"/>
            </xs:sequence>                  
        </xs:complexType>
    </xs:element>

    <xs:complexType name="query">
        <xs:sequence>
            <xs:element name="table" type="mysql:table" minOccurs="1"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>


.. met als xml ..

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>

<stream xmlns="http://www.sove.nl/ns/core/" 
                xmlns:mysql="http://www.sove.nl/ns/system/mysql/"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://www.sove.nl/ns/core/ http://www.sove.nl/ns/core.xsd">
                
                
    <mysql:set>     
        <mysql:query type="select">
            <mysql:table />
        </mysql:query>
    </mysql:set>
        
        
</stream>

.. geeft ..

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Warning: DOMDocument::schemaValidate() [function.DOMDocument-schemaValidate]: 
Validation failed: no DTD found 
!Element '{http://www.sove.nl/ns/system/mysql/}query': 
This element is not expected. 
Expected is ( query ). 
in /var/www/client/sove.nl/httpdocs/xmysql_mysql.php 
on line 34

Warning: DOMDocument::schemaValidate() [function.DOMDocument-schemaValidate]: 
Invalid Schema in /var/www/client/sove.nl/httpdocs/xmysql_mysql.php 
on line 34

Fatal error: 
Uncaught exception 'DOMException' with message 
'XML Schema Validation Failure' 
in /var/www/client/sove.nl/httpdocs/xmysql_mysql.php:38 

Stack trace: 
#0 /var/www/client/sove.nl/httpdocs/xmysql_mysql.php(7): 
SchemaDOMDocument->validateXMLSchemas() #1 
{main} thrown in /var/www/client/sove.nl/httpdocs/xmysql_mysql.php 
on line 38


Maar ik weet dus inderdaad ook niet wat er nu fout aan is.

Hier heb ik ook al eerder een topic over gehad wat er volgens mij een overlap mee heeft:
http://gathering.tweakers.net/forum/list_messages/1278544
Nog nooit opgelost. En werkt nu door in dit probleem.

Moet ik misschien ergens iets met abstract?

[ Voor 23% gewijzigd door r0bert op 31-03-2008 23:34 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 18-04 23:52
De W3 specifications net weer doorgelezen over XML Schema, maar volgens die documenten doe ik volgens mij niets fout. Zou het dan toch een bug in libxml/php kunnen zijn?

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 18-04 23:52
Ik mag wel refereren aan een element, maar niet aan een type:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <xs:complexType name="table">
        <xs:sequence>
            <xs:element ref="field" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>
[..]
    <xs:complexType name="field">
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="table" type="xs:string" use="optional" />
    </xs:complexType>
[..]

    <xs:element name="field"            type="field" />

Bovenstaand is geen probleem. Echter als ik direct de type defineer als hieronder:
XML:
1
2
3
4
5
6
7
8
9
10
11
    <xs:complexType name="table">
        <xs:sequence>
            <xs:element name="field" type="mysql:field" minOccurs="0" maxOccurs="unbounded" /> <!-- of type="field" //-->
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
    </xs:complexType>
[..]
    <xs:complexType name="field">
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="table" type="xs:string" use="optional" />
    </xs:complexType>


Geeft de fout dat niet mysql:field (elm) wordt verwacht, maar field (blanke namespace). Een oplossing lijkt om gewoon de elm-ref te gebruiken, maar dat gaat niet in het geval van extenden, bijv:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
    <xs:complexType name="cond">
        <xs:sequence>
            <xs:element name="field" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="field">
                            <xs:attribute name="operator" type="xs:string" use="required" />
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>       
            </xs:element>
        </xs:sequence>
    </xs:complexType>

Bovenstaand moet dezelfde tag zijn ('field'), maar omdat het een andere parent heeft, aan een uitgebreidere conditie voldoen. De allereerste oplossing is hier dus niet mogelijk. Ik zoek naar een oplossing, maar kan niets vinden.

Zit nu al 3 dagen vast met dit gezeur allemaal, wel balen hoor. Als iemand een antwoord weet, reageer svp even. Als het nodig is heb ik er ook wel een vergoeding voor over, maar dat terzijde omdat dat hier niet bepaald ontopic hoort.

Ik zou erg blij zijn met een oplossing :)

Mijn schema valideert trouwens wel bij veel online validators. Des te vager.

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 18-04 23:52
Intussen gepost op xml-dev mailing list en ander forum, maar geen reacties.. zit nog steeds vast. Kan het ook in de xmlns-tags zitten? Bijv. in mijn bron XML?

Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-04 16:18
Misschien dat je de attributen nog even recht moet zetten:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="http://www.sove.nl/ns/core/" 
  xmlns:mysql="http://www.sove.nl/ns/system/mysql/"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://www.sove.nl/ns/core/">
  elementFormDefault="qualified" attributeFormDefault="unqualified">
</xs:schema>

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 18-04 23:52
Lost het probleem niet op helaas. Bedankt voor de poging tot nu toe. Ik ga er nog even mee doorzoeken.

Er zit vooruitgang in geloof ik! Hij zeurt nu nog over een attribuut van een extension, die zou zonder namespace moeten. Maar vind ik niet :P

[edit]
Ojó, geen foutmelding meer! Ik ben vét blij! _/-\o_ 8) :*) Ik ruzie nog wat met die attributes. Post wel even de uitkomst. Geniaal man!

[ Voor 64% gewijzigd door r0bert op 02-04-2008 16:46 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 18-04 23:52
Is het ook mogelijk om de default namespace:

XML:
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<stream xmlns="http://sove.nl/ns/core/" xmlns:mysql="http://sove.nl/ns/system/mysql/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://sove.nl/ns/core/ http://sove.nl/ns/core2.xsd">
    <mysql:set xmlns="http://sove.nl/ns/system/mysql/">
        <query mysql:type="select" />
    </mysql:set>
</stream>

Met element- en attributeFormDefault op qualified. Ik moet voor de attributen nog steeds mysql: gebruiken in defaultnamespace (behalve als ik attributeFormDefault op unqualified zet). Ik zou het liefst willen dat ook de attributen de namespace decl. aanhouden. Is dat apart gedrag van de attributen? In de specs vond ik hier niets over.


Edit: laat maar, da's dus wel unqualified. :D

[ Voor 3% gewijzigd door r0bert op 02-04-2008 16:56 ]

Pagina: 1