XML Schema - "voorvoegsel niet aan een namespace gebonden"

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Update 12 november 2008, zie hier

Oude topic:
Ik wil graag medetweakers om versterking vragen. Ik ben al twee dagen bezig met een 'stom' XML schema. Het is nog helemaal niets, alleen de eerste opzet. Maar het wil gewoon niet valideren! Volgens mij heeft het te maken met namespaces of de locatie van het xmlschema, maar ik heb er nog maar één namespace in overgelaten dus snap niet wat er nog fout gaat.

Kan iemand mij vertellen wat en (daarmee) waarom ik (het) fout doe?

Mijn (beperkte) XML:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>

<core:root xmlns:core="http://www.sove.nl/core/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sove.nl/ 18feb08_main.xsd">
    <core:data>
        <core:database>tesT</core:database>
    </core:data>
    <core:convert>conVert</core:convert>
</core:root>


En mijn daarbij behorende XML Schema/XSD:
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:core="http://www.sove.nl/core/"
                     xmlns:xs="http://www.w3.org/2001/XMLSchema"
                     elementFromDefault="qualified"
                     attributeFromDefault="unquilified">
    
    <xs:element name="core:root">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="core:data" /> 
                <xs:element ref="core:convert" /> 
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="core:data">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="core:database" /> 
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="core:database" type="xs:string" /> 
    <xs:element name="core:convert" type="xs:string" /> 
</xs:schema>


Het laden van de XML faalt al in IE en FF, maar via validators is dat ook terug te vinden.
Voorbeelden van validators:
XSV (XSD) Valideer bovenstaande XSD
Schneegans SV (XML met XSD) Valideer bovestaande XML/XSD

Als iemand me weer op gang kan helpen graag,Ik zou heel graag verder kunnen O-)

[ Voor 16% gewijzigd door r0bert op 12-11-2008 19:22 ]


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
error on line 3 at column 50: Namespace prefix xsi for schemaLocation on root is not defined

Ben ik nou zo dom of zijn jullie nou zo slim?


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:10

Creepy

Tactical Espionage Splatterer

code:
1
xsi:schemaLocation="http://www.sove.nl/ 18feb08_main.xsd">

Is dit een tikfout of zit je je hierop nu blind te staren?

Als dit het niet is: wat heb je nu zelf al voor aanpassingen geprobeerd om het wel aan de gang te krijgen en welke (eventuele) foutmeldingen kreeg je daar mee dan? Zie ook Programming Beleid en dan met name Programming Beleid - De Quickstart voor de zaken die zouden moeten terugkomen in een TS.

[ Voor 61% gewijzigd door Creepy op 25-02-2008 16:29 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Sorry, dat was inderdaad een hele domme fout van me. Had al zoveel in zitten rommelen, moest wel eens fout gaan. Maar het valideren gaat volgens mij nog steeds niet.

Edit:
Was inderdaad lelijke typfout. De browsers werken nu in ieder geval mee, maar valideren wil nog steeds niet. Er is altijd iets mis met het root element, maar ik heb alle opties al geprobeerd! Ik snap niet meer hoe het dan wél zou moeten. Ik heb voorbeelden, tutorials, w3 specs doorgelezen. Zonder resultaat, niets is goedgekeurd. Voor foutmeldingen zie de validators (vooral de 2e).

Het lijkt al beter te gaan, maar ik heb dan nu ook geen namespaces meer in mijn XML Schema, die wil ik daar wel terug :'(

Een nieuwere versie, begint weer over de root te zeuren
Hier

[ Voor 76% gewijzigd door r0bert op 25-02-2008 16:47 ]


Acties:
  • 0 Henk 'm!

  • Japius
  • Registratie: April 2003
  • Laatst online: 03-07 18:59
Euh... volgens mij zit er ook nog een spatie in de link naar je schema:
code:
1
<core:root xsi:schemaLocation="http://www.sove.nl/ 18feb08_main.xsd">

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Ik dacht dat dat erin moest omdat dat veel terugkwam in voorbeelden. Heb het er in een nieuwer schema uit gehaald. Maar dan ben ik er nog niet.

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

In het schema (de XSD) moet je niet 'core' zelf gebruiken. Alle elementen (en attributen) hebben namelijk niets met de prefix zelf te maken. De prefix in XML is alleen om de verschillende namespaces uit elkaar te houden. Je kunt in de XML de namespace prefix ook veranderen naar 'c'. Als je vervolgens in de XML elementen zoals <c:root> gebruikt is er niets aan de hand. 'core' is dus niet onderdeel van je schema, maar slechts een verwijzing ernaar.

Echter in de XSD geeft je aan dat de namespace zichzelf moet valideren (eigenlijk een recursieve declaratie dus).

In de XSD moet je dus de xslns:core declaratie weglaten, want deze defineer je juist.

[ Voor 8% gewijzigd door Niemand_Anders op 25-02-2008 16:54 ]

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Oké. Dus per namespace moet ik een schema maken?

De naam core is omdat deze elementen het basisframe vormen van de xml-messages.

Als ik meerdere namespaces ga gebruiken, hoe weet de validator dan welke namespace bij welk xml schema hoort?

Edit:
Neem aan dat ik dat zo doe?
XML:
1
xsi:schemaLocation="http://www.sove.nl/core/ http://www.sove.nl/25feb08_main.xsd"

Validator pakt het niet, ligt het aan die validator zelf?
code:
1
2
3
4
5
Attempt to load a schema document from
http://www.sove.nl/25feb08_main.xsd
 (source: command line) for
   no namespace,
    succeeded

Lijkt me niet juist.

[ Voor 75% gewijzigd door r0bert op 25-02-2008 17:03 ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

r0bert schreef op maandag 25 februari 2008 @ 16:53:
Oké. Dus per namespace moet ik een schema maken?

De naam core is omdat deze elementen het basisframe vormen van de xml-messages.

Als ik meerdere namespaces ga gebruiken, hoe weet de validator dan welke namespace bij welk xml schema hoort?
Als je meer dan 1 schema gebruikt, dan dien je prefixes te gebruiken om de elementen uit elkaar te houden. Je zou namelijk zeer eenvoudig in twee schema's een database element kunnen defineren. Door het gebruik van de prefix weet de XML parser welke je bedoelt.

Meestal wordt de namespace van het root element alleen via xmlns='' gedeclareerd en de overige krijgen dan kun prefix. Je dient dus per schema een andere prefix aan te houden. De schema's kun echter ook naar elkaar wijzen, maar dan dien je in het betreffende schema een exta namespace prefix te declareren. Vanwege de scope van de namespace prefix declaratie hoef je niet bang te zijn voor conflicterende namespaces. Elk schema staat los en prefixes bekend in een schema zijn daarbuiten niet 'bekend'.

XML:
1
2
3
4
5
6
7
8
9
10
11
<root  
   xmlns="http://www.sove.nl/18feb08_main.xsd" 
   xmlns:tbl="http://www.sove.nl/18feb08_table.xsd" >
  <database>
   <tbl:table>
      <tbl:field  ... />
       ...
   </tbl:table>
    ...
  </database>
</root>


tbl is dus alleen een verwijzing naar de 18feb08_table.xsd. 'tbl' bestaat dus niet in het schema zelf, alleen in main.xml.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Ja, maar zo heb ik het toch nu ook? Zo heb ik het altijd geleerd, maar het wil niet valideren. En ik snap niet wat ik fout doe. Ik zal je aanpassing invoeren, hoewel ik het vreemd vind dat er vanaf de root met een default namespace gewerkt moet worden.

Wat is in bovenstaand voorbeeld nou de prefix van de main? Voor als ik die binnen de table wil gebruiken? Ik probeer het in mijn code voor elkaar te krijgen, maar het lijkt echt hopeloos.

Edit:
Huh, mag ik nu de schemaverwijzingen ook al in de namespace zelf plaatsen?

Edit:
Ik snap er echt helemaal niets meer van. Ik wil gewoon een XML Schema maken om een XML document met 2 namespaces te valideren. Waarin ik de prefixes core: en data: door elkaar kan gebruiken. Maar ik krijg niets door die }:Ovalidator goedgekeurd.

[ Voor 53% gewijzigd door r0bert op 25-02-2008 17:17 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Tot zover heb ik het nu voor elkaar:

Validatie PHP
Bron XML
Schema XSD

Het idee van de namespaces is op zijn plek gevallen, ik begrijp het. Alleen zit ik nog steeds te stoeien met de root, dat lijkt niet goed te gaan. Iemand die hulp kan bieden?


Het lijkt te zijn gelukt met een targetNamespace. Geen idee waarom dit verplicht is.

[ Voor 10% gewijzigd door r0bert op 25-02-2008 22:08 ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

r0bert schreef op maandag 25 februari 2008 @ 17:09:
Ja, maar zo heb ik het toch nu ook? Zo heb ik het altijd geleerd, maar het wil niet valideren. En ik snap niet wat ik fout doe. Ik zal je aanpassing invoeren, hoewel ik het vreemd vind dat er vanaf de root met een default namespace gewerkt moet worden.
Hoeft niet, maar is wel gebruikelijk. Denk bijvoorbeeld aan xhtml in combinatie met MathML. Of veel XSLT stylesheets. Meestal wordt dan ook als default namespace die van xhtml gebruikt.

[/quote]
Wat is in bovenstaand voorbeeld nou de prefix van de main? Voor als ik die binnen de table wil gebruiken? Ik probeer het in mijn code voor elkaar te krijgen, maar het lijkt echt hopeloos.
[/quote]
Alles zonder prefix is gekoppeld aan main.xsd (ofwel de namespace uit xmlns='')
Huh, mag ik nu de schemaverwijzingen ook al in de namespace zelf plaatsen?
Euh ja, want doe ga je anders aangeven dat een element van een andere namespace is toegestaan? Bijvoorbeeld in een SimpleType sequence. Alleen de prefix van de schema's welke je 'importeerd' in jouw XSD zijn daarbuiten niet bekend.
[/quote]
Ik snap er echt helemaal niets meer van. Ik wil gewoon een XML Schema maken om een XML document met 2 namespaces te valideren. Waarin ik de prefixes core: en data: door elkaar kan gebruiken. Maar ik krijg niets door die }:Ovalidator goedgekeurd.
Waarschijnlijk omdat in de core namespace 'data' onbekend is. Omdat deze onbekend is, zullen elementen uit de 'data' namespace ook niet in je 'core' namespace voorkomen. Als jij in de XML zelf wel de twee namespaces combineerd, dan zal je XML niet valideren aan de schema's welke je hebt opgegeven. Als je wel 'data' elementen opneemt in de core xsd zonder dat de prefix bekend is, dan is het schema zal incorrect. Automatisch dan dan alles *niet* voldoen aan de namespace (althans in .NET/MSXML). De gedachte daarachter is dat als het schema ongeldig is, de XML data zelf nooit correct kan wezen per definitie.


Met targetNamespace kun je de namespace 'binden' aan een uri.

Ik denk dat dit artikel je iets meer inzicht geeft in hoe je meerdere namespaces door elkaar kunt gebruiken. Let op de combinatie xmlns:xxx en xsd:import/include (welke ik was vergeten in mijn voorbeeld). xmlns:xxx is alleen een verwijzing naar een namespace. Hij wordt dan nog niet ingelezen. Om de elementen in de XSD zelf te kunnen gebruiken dient de XSD geimporteert te worden.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Interessant artikel. Ik heb het stap voor stap aangehouden volgens mij, maar nog werkt het niet. Ik begrijp namespaces beter, maar nog steeds niet wat ik toch fout doe. Het is om te huilen. Wil iemand me even te hulp schieten?

Validatie
XML
XSD
XSD typedef

Voor de eenvoud en search hieronder ook nog even geplakt:

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

<stream xmlns="http://www.sove.nl/ns/core/" 
                xmlns:boek="http://www.sove.nl/ns/types/boek/"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://www.sove.nl/ns/core/ http://www.sove.nl/ns/core.xsd">
    
    <settype>boekenlijst</settype>
    <boek:boek>
        <boek:schrijver>test</boek:schrijver>
    </boek:boek>
</stream>


XSD
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
<?xml version="1.0" encoding="utf-8"?>

<xs:schema  targetNamespace="http://www.sove.nl/ns/core/"                       
                        xmlns="http://www.sove.nl/ns/core/" 
                        xmlns:boek="http://www.sove.nl/ns/types/boek/"
                        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                    
                        elementFormDefault="unqualified">

    <xs:import  namespace="http://www.sove.nl/ns/types/boek/" 
                            schemaLocation="http://www.sove.nl/ns/types/boek.xsd" />
    
    
    <xs:element name="stream">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="settype" type="xs:string" maxOccurs="unbounded" />
                <xs:element name="boek" type="boek:boekDef" maxOccurs="unbounded" /> 
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    
</xs:schema>


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

<xs:schema  targetNamespace="http://www.sove.nl/ns/types/boek/"
                        xmlns="http://www.sove.nl/ns/types/boek/" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                        elementFormDefault="unqualified">

    <xs:complexType name="boekDef">
        <xs:all>
            <xs:element name="schrijver" type="xs:string"/>
        </xs:all>
    </xs:complexType>

</xs:schema>


Error waar ik momenteel mee zit (zie validatie) is:
code:
1
Validation failed: no DTD found !Element '{http://www.sove.nl/ns/core/}settype': This element is not expected. Expected is one of ( settype, boek ).

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:10

Creepy

Tactical Espionage Splatterer

Again, wat heb je nu zelf nog geprobeerd om je foutmelding op te lossen en wat lukte daar niet mee? Je code + fout dumpen is hier niet de bedoeling.

[ Voor 11% gewijzigd door Creepy op 26-02-2008 23:26 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Ik heb alles geprobeerd. Ik heb de w3 specs van de recommedation gevolgt (part 0, 1 en 2). Bovenstaand artikel doorgespit en stap voor stap doorgelopen. Ik heb tientallen google pagina's doorgespit, code search erbij gehad, examples doorgebladert. Ik weet gewoon niet meer wat ik fout kan doen. Foutmeldingen die ik gehad heb zijn er teveel om op te noemen, maar waar ik nu mee zat heb ik er onderaan bij vermeld.

Wat daarmee niet lukt is dat de XML nog steeds niet valideert met het schema, maar het schema wel door elke validator heen komt.

Naar mijn idee lijkt ie toch nog altijd over de root te struikelen ('stream').

[ Voor 19% gewijzigd door r0bert op 27-02-2008 00:00 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Na het automatisch laten genereren van een XML schema aan de hand van mijn XML is het gelukt. Uiteindelijk is het gezeur weggegaan door het gebruiken van dit stukje code:

XML:
1
2
3
4
5
6
7
8
<xs:element name="stream">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="settype"/>
                <xs:element ref="boek:boek"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


Ipv direct een type="xs:string" mee te geven aan settype. Ik weet nog steeds niet wat ik fout heb gedaan, maar het werkt nu.

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Inmiddels een half jaartje later, maar ik loop weer tegen het probleem aan:

Message
XML:
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<someRequest xmlns="urn:sove:default">
    <someArg>test</someArg>
</someRequest>


Schema
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:sove:default" 
               targetNamespace="urn:sove:default">
    
    <xs:complexType name="srvSomeRequest">
        <xs:all>
            <xs:element name="someArg" type="xs:string" />
        </xs:all>
    </xs:complexType>
    
    <xs:element name="someRequest" type="srvSomeRequest" />
    
</xs:schema>


Validatie (met XMLReader d.m.v. libxml2) geeft:
code:
1
2
3
Warning: XMLReader::read() [xmlreader.read]: 
   Element '{urn:sove:default}someArg': This element is not expected. 
   Expected is ( someArg ). in /var/www/some/tld/class/class.request.php on line 89


Doe ik iets fout?

  • r0bert
  • Registratie: September 2001
  • Laatst online: 05-07 11:20
Voorlopig even gered d.m.v.

attributeFormDefault="unqualified"
of
attributeFormDefault="qualified"
@ [XML Schema] Multiple namespace - type als ns:QNAME?

[ Voor 11% gewijzigd door r0bert op 13-11-2008 08:43 ]

Pagina: 1