Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > XML > Convert very simple DTD-file to XSD

Reply
Thread Tools

Convert very simple DTD-file to XSD

 
 
Eric Lilja
Guest
Posts: n/a
 
      02-20-2007
Hello, this is an xml-file with a nested DTD. It validates, test-1-
with-dtd.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE persons [
<!ELEMENT persons (person*)>

<!ELEMENT person EMPTY>
<!ATTLIST person name CDATA #REQUIRED>
]>
<persons>
<person name="Eric Lilja" />
</persons>


Now I want to use an XML Schema (located in a separate file) instead
of a nested DTD. I've created the following schema (test-1.xsd):
<?xml version="1.0"?>
<xs:schema xmlnss="http://www.w3.org/2001/XMLSchema"
targetNamespace="myns"
xmlns="myns"
elementFormDefault="unqualified">
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element name="person">
<xs:complexType>
<xs:attribute name="name" type="xs:string"
use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

I want this schema to accomplish what my DTD above accomplishes. The
schema itself validates, but this xml file that tries to use does not.
test-1-with-xsd.xml:
<?xml version="1.0" encoding="utf-8"?>
<persons xmlns="myns" xmlnssi="http://www.w3.org/2001/XMLSchema-
instance" xsi:schemaLocation="myns test-1.xsd">
<person name="Eric Lilja"/>
</persons>

The validator says:
Location: 4:4
Description: cvc-complex-type.2.4.a: Invalid content was found
starting with element 'person'. One of '{person}' is expected.

I'm very new with xml (second day, hehe) and this is my very first
schema. What is the problem? I guess it's a problem with the XML
schema even though it validates becuase the test-1-with-xsd.xml that
uses it looks OK to me (and it should look like the one using the
DTD).

- Eric

 
Reply With Quote
 
 
 
 
usenet@tech-know-ware.com
Guest
Posts: n/a
 
      02-21-2007
On 20 Feb, 23:57, "Eric Lilja" <mindcoo...@gmail.com> wrote:
> Hello, this is an xml-file with a nested DTD. It validates, test-1-
> with-dtd.xml:
>
> <?xml version="1.0" encoding="utf-8"?>
> <!DOCTYPE persons [
> <!ELEMENT persons (person*)>
>
> <!ELEMENT person EMPTY>
> <!ATTLIST person name CDATA #REQUIRED>
> ]>
> <persons>
> <person name="Eric Lilja" />
> </persons>
>
> Now I want to use an XML Schema (located in a separate file) instead
> of a nested DTD. I've created the following schema (test-1.xsd):
> <?xml version="1.0"?>
> <xs:schema xmlnss="http://www.w3.org/2001/XMLSchema"
> targetNamespace="myns"
> xmlns="myns"
> elementFormDefault="unqualified">
> <xs:element name="persons">
> <xs:complexType>
> <xs:sequence>
> <xs:element name="person">
> <xs:complexType>
> <xs:attribute name="name" type="xs:string"
> use="required"/>
> </xs:complexType>
> </xs:element>
> </xs:sequence>
> </xs:complexType>
> </xs:element>
> </xs:schema>
>
> I want this schema to accomplish what my DTD above accomplishes. The
> schema itself validates, but this xml file that tries to use does not.
> test-1-with-xsd.xml:
> <?xml version="1.0" encoding="utf-8"?>
> <persons xmlns="myns" xmlnssi="http://www.w3.org/2001/XMLSchema-
> instance" xsi:schemaLocation="myns test-1.xsd">
> <person name="Eric Lilja"/>
> </persons>
>
> The validator says:
> Location: 4:4
> Description: cvc-complex-type.2.4.a: Invalid content was found
> starting with element 'person'. One of '{person}' is expected.


To clear up a simple things first, to match your DTD, the line:

<xs:element name="person">

should be:

<xs:element name="person" minOccurs="0" maxOccurs="unbound">

The main problem you have though is a bit more involved. In your XML
instance you've defined the default namespace to be 'myns'. In your
schema you've specified that local elements are unqualified. When the
tag of the person element is read, the default namespace takes
precedence over the 'no' namespace. So the name returned in
effectively:

{ namespace="myns"; localName="person"; }.

However, because the local elements are marked as unqualified, the
processor is expecting:

{ namespace=""; localName="person"; }.

As you can see, they don't match, hence the problem.

To fix this, you can either set elementFormDefault="qualified", which
is probably the right thing to do in a schema.

Or you can say that DTDs are not namespace aware, and if you want to
replicate your DTD exactly you should not associate your schema with a
namespace either. In this case you would remove the
targetNamespace="myns" and xmlns="myns" attributes from teh schema.

HTH,

Pete.
--
=============================================
Pete Cordell
Tech-Know-Ware Ltd
for XML to C++ data binding visit
http://www.tech-know-ware.com/lmx
(or http://www.xml2cpp.com)
=============================================

 
Reply With Quote
 
 
 
 
Eric Lilja
Guest
Posts: n/a
 
      02-21-2007
Hi Pete and thanks for your reply! My answers are below...

On 21 Feb, 10:41, use...@tech-know-ware.com wrote:
> On 20 Feb, 23:57, "Eric Lilja" <mindcoo...@gmail.com> wrote:
>
>
>
> > Hello, this is an xml-file with a nested DTD. It validates, test-1-
> > with-dtd.xml:

>
> > <?xml version="1.0" encoding="utf-8"?>
> > <!DOCTYPE persons [
> > <!ELEMENT persons (person*)>

>
> > <!ELEMENT person EMPTY>
> > <!ATTLIST person name CDATA #REQUIRED>
> > ]>
> > <persons>
> > <person name="Eric Lilja" />
> > </persons>

>
> > Now I want to use an XML Schema (located in a separate file) instead
> > of a nested DTD. I've created the following schema (test-1.xsd):
> > <?xml version="1.0"?>
> > <xs:schema xmlnss="http://www.w3.org/2001/XMLSchema"
> > targetNamespace="myns"
> > xmlns="myns"
> > elementFormDefault="unqualified">
> > <xs:element name="persons">
> > <xs:complexType>
> > <xs:sequence>
> > <xs:element name="person">
> > <xs:complexType>
> > <xs:attribute name="name" type="xs:string"
> > use="required"/>
> > </xs:complexType>
> > </xs:element>
> > </xs:sequence>
> > </xs:complexType>
> > </xs:element>
> > </xs:schema>

>
> > I want this schema to accomplish what my DTD above accomplishes. The
> > schema itself validates, but this xml file that tries to use does not.
> > test-1-with-xsd.xml:
> > <?xml version="1.0" encoding="utf-8"?>
> > <persons xmlns="myns" xmlnssi="http://www.w3.org/2001/XMLSchema-
> > instance" xsi:schemaLocation="myns test-1.xsd">
> > <person name="Eric Lilja"/>
> > </persons>

>
> > The validator says:
> > Location: 4:4
> > Description: cvc-complex-type.2.4.a: Invalid content was found
> > starting with element 'person'. One of '{person}' is expected.

>
> To clear up a simple things first, to match your DTD, the line:
>
> <xs:element name="person">
>
> should be:
>
> <xs:element name="person" minOccurs="0" maxOccurs="unbound">


Ah, thanks for spotting that one! Changed to <xs:element name="person"
minOccurs="0" maxOccurs="unbounded">

>
> The main problem you have though is a bit more involved. In your XML
> instance you've defined the default namespace to be 'myns'. In your
> schema you've specified that local elements are unqualified. When the
> tag of the person element is read, the default namespace takes
> precedence over the 'no' namespace. So the name returned in
> effectively:
>
> { namespace="myns"; localName="person"; }.
>
> However, because the local elements are marked as unqualified, the
> processor is expecting:
>
> { namespace=""; localName="person"; }.
>
> As you can see, they don't match, hence the problem.
>
> To fix this, you can either set elementFormDefault="qualified", which
> is probably the right thing to do in a schema.
>
> Or you can say that DTDs are not namespace aware, and if you want to
> replicate your DTD exactly you should not associate your schema with a
> namespace either. In this case you would remove the
> targetNamespace="myns" and xmlns="myns" attributes from teh schema.
>
> HTH,
>
> Pete.



Oh, yes, that helps alot, Pete! Thanks so much! I've made a version
that doesn't incorporate namespaces and it passes validation. It looks
like this:
persons.xsd:
<?xml version="1.0"?>
<xs:schema xmlnss="http://www.w3.org/2001/XMLSchema">
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element name="person" minOccurs="0"
maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string"
use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

persons.xml:
<?xml version="1.0" encoding="utf-8"?>
<persons xmlnssi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="persons.xsd">
<person name="Eric Lilja"/>
</persons>

Now I'm going to try to make a namespace version and when that works I
will try to tackle some more complicated DTDs (but still simple).
Thanks again, you've been a tremendous help!

- Eric

 
Reply With Quote
 
Eric Lilja
Guest
Posts: n/a
 
      02-21-2007
See namespace version below

On 21 Feb, 13:28, "Eric Lilja" <mindcoo...@gmail.com> wrote:
> Hi Pete and thanks for your reply! My answers are below...
>
> On 21 Feb, 10:41, use...@tech-know-ware.com wrote:
>
>
>
> > On 20 Feb, 23:57, "Eric Lilja" <mindcoo...@gmail.com> wrote:

>
> > > Hello, this is an xml-file with a nested DTD. It validates, test-1-
> > > with-dtd.xml:

>
> > > <?xml version="1.0" encoding="utf-8"?>
> > > <!DOCTYPE persons [
> > > <!ELEMENT persons (person*)>

>
> > > <!ELEMENT person EMPTY>
> > > <!ATTLIST person name CDATA #REQUIRED>
> > > ]>
> > > <persons>
> > > <person name="Eric Lilja" />
> > > </persons>

>
> > > Now I want to use an XML Schema (located in a separate file) instead
> > > of a nested DTD. I've created the following schema (test-1.xsd):
> > > <?xml version="1.0"?>
> > > <xs:schema xmlnss="http://www.w3.org/2001/XMLSchema"
> > > targetNamespace="myns"
> > > xmlns="myns"
> > > elementFormDefault="unqualified">
> > > <xs:element name="persons">
> > > <xs:complexType>
> > > <xs:sequence>
> > > <xs:element name="person">
> > > <xs:complexType>
> > > <xs:attribute name="name" type="xs:string"
> > > use="required"/>
> > > </xs:complexType>
> > > </xs:element>
> > > </xs:sequence>
> > > </xs:complexType>
> > > </xs:element>
> > > </xs:schema>

>
> > > I want this schema to accomplish what my DTD above accomplishes. The
> > > schema itself validates, but this xml file that tries to use does not.
> > > test-1-with-xsd.xml:
> > > <?xml version="1.0" encoding="utf-8"?>
> > > <persons xmlns="myns" xmlnssi="http://www.w3.org/2001/XMLSchema-
> > > instance" xsi:schemaLocation="myns test-1.xsd">
> > > <person name="Eric Lilja"/>
> > > </persons>

>
> > > The validator says:
> > > Location: 4:4
> > > Description: cvc-complex-type.2.4.a: Invalid content was found
> > > starting with element 'person'. One of '{person}' is expected.

>
> > To clear up a simple things first, to match your DTD, the line:

>
> > <xs:element name="person">

>
> > should be:

>
> > <xs:element name="person" minOccurs="0" maxOccurs="unbound">

>
> Ah, thanks for spotting that one! Changed to <xs:element name="person"
> minOccurs="0" maxOccurs="unbounded">
>
>
>
>
>
> > The main problem you have though is a bit more involved. In your XML
> > instance you've defined the default namespace to be 'myns'. In your
> > schema you've specified that local elements are unqualified. When the
> > tag of the person element is read, the default namespace takes
> > precedence over the 'no' namespace. So the name returned in
> > effectively:

>
> > { namespace="myns"; localName="person"; }.

>
> > However, because the local elements are marked as unqualified, the
> > processor is expecting:

>
> > { namespace=""; localName="person"; }.

>
> > As you can see, they don't match, hence the problem.

>
> > To fix this, you can either set elementFormDefault="qualified", which
> > is probably the right thing to do in a schema.

>
> > Or you can say that DTDs are not namespace aware, and if you want to
> > replicate your DTD exactly you should not associate your schema with a
> > namespace either. In this case you would remove the
> > targetNamespace="myns" and xmlns="myns" attributes from teh schema.

>
> > HTH,

>
> > Pete.

>
> Oh, yes, that helps alot, Pete! Thanks so much! I've made a version
> that doesn't incorporate namespaces and it passes validation. It looks
> like this:
> persons.xsd:
> <?xml version="1.0"?>
> <xs:schema xmlnss="http://www.w3.org/2001/XMLSchema">
> <xs:element name="persons">
> <xs:complexType>
> <xs:sequence>
> <xs:element name="person" minOccurs="0"
> maxOccurs="unbounded">
> <xs:complexType>
> <xs:attribute name="name" type="xs:string"
> use="required"/>
> </xs:complexType>
> </xs:element>
> </xs:sequence>
> </xs:complexType>
> </xs:element>
> </xs:schema>
>
> persons.xml:
> <?xml version="1.0" encoding="utf-8"?>
> <persons xmlnssi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:noNamespaceSchemaLocation="persons.xsd">
> <person name="Eric Lilja"/>
> </persons>
>
> Now I'm going to try to make a namespace version and when that works I
> will try to tackle some more complicated DTDs (but still simple).
> Thanks again, you've been a tremendous help!
>
>


Here's my namespace version, does it look ok? It passes validation.
persons.xsd:
<?xml version="1.0"?>
<xs:schema xmlnss="http://www.w3.org/2001/XMLSchema"
targetNamespace="myns" xmlns="myns" elementFormDefault="qualified">
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element name="person" minOccurs="0"
maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:string"
use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

persons.xml:
<?xml version="1.0" encoding="utf-8"?>
<persons xmlns="myns" xmlnssi="http://www.w3.org/2001/XMLSchema-
instance" xsi:schemaLocation="myns persons.xsd">
<person name="Eric Lilja"/>
</persons>

All input appreciated!

- Eric

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
convert XML to XSD? or DTD to XSD? Matt XML 3 09-11-2008 12:40 PM
Help running a very very very simple code olivier.melcher Java 8 05-12-2008 07:51 PM
very very very long integer shanx__=|;- C Programming 19 10-19-2004 03:55 PM
Quick Book file access very very very slow Thomas Reed Computer Support 7 04-09-2004 08:09 PM
very Very VERY dumb Question About The new Set( ) 's Raymond Arthur St. Marie II of III Python 4 07-27-2003 12:09 AM



Advertisments
 



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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57