Avatar billede jlykkegaard Nybegynder
07. oktober 2005 - 21:23 Der er 1 løsning

XSD og namespaces.

Jeg skal lave et XSD dokument der skal passe til følgende .xml fil:

<?xml version="1.0"?>
<catalog xmlns="CATALOG" xmlns:gr="Group" xmlns:ct="CATALOG" xmlns:tl="TYPELIBNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="CATALOG Catalog.xsd" elementFormDefault="qualified" attributeFormDefault="qualified" >
    <contact contactId="1" nationality="gb" gender="male">
        <ct:name>
            <first>John</first>
            <last>Milton</last>
        </ct:name>
        <ct:address>
            <tl:street>2, Main Street</tl:street>
            <tl:city>Nottingham</tl:city>
            <tl:postalCode>34566</tl:postalCode>
            <tl:country>England</tl:country>
        </ct:address>
        <tl:phone>+44 6765645</tl:phone>
        <tl:email>john.milton@work.com</tl:email>
    </contact>
</catalog>

Jeg vil så lave xsd filer for hvert namespace, og så importe dem sammen i Catalog.xsd, hvor jeg også beskriver strukturen.

Catalog.xsd :

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2006 U (http://www.altova.com) by Sigurdur Palsson (Vejle hs) -->
<xs:schema xmlns:ct="Contact" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="CATALOG"  xmlns:tl="TYPELIBNS">
    <xs:import namespace="TYPELIBNS" schemaLocation="TypeLib.xsd"/>
        <xs:import namespace="CONTACT" schemaLocation="contactType.xsd"/>
    <xs:element name="catalog">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="contact">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" >
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="first" type="tl:TYPEfirst"  />
                                        <xs:element name="middle" minOccurs="0"  type="tl:TYPEmiddle" />
                                        <xs:element name="last"  type="tl:TYPElast"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="address">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="street"/>
                                        <xs:element name="city"/>
                                        <xs:element name="postal"/>
                                        <xs:element name="country"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Jeg har så også TypeLib.xsd hvor at jeg vil definere typerne, og give det namespace tl: sådan at det passer med xml dokumentet.

TypeLib.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tl="TYPELIBNS" targetNamespace="TYPELIBNS" elementFormDefault="qualified"  attributeFormDefault="unqualified">
<xs:simpleType name="TYPEfirst">
    <xs:restriction base="xs:string"></xs:restriction>
</xs:simpleType>
<xs:simpleType name="TYPEmiddle">
    <xs:restriction base="xs:string"></xs:restriction>
</xs:simpleType>
<xs:simpleType name="TYPElast">
    <xs:restriction base="xs:string"></xs:restriction>
</xs:simpleType>
</xs:schema>


og så har jeg til sidst ContactType.xsd der har namespace prefix ct:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tl="TYPELIBNS" elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="CONTACT" xmlns:ct="CONTACT">
    <xs:import namespace="TYPELIBNS" schemaLocation="TypeLib.xsd"/>
    <xs:element name="name">
        <xs:complexType>
            <xs:sequence>
                <xs:element  name="first" type="tl:TYPEfirst"/>
                <xs:element name="middle" minOccurs="0" type="tl:TYPEmiddle"/>
                <xs:element name="last" type="tl:TYPElast"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>


Problemet er så at den failer ved
<tl:street>2, Main Street</tl:street> i valideringen.

Det skyldes tl: tagget, den forventer bare street.

Jeg har fjernet tl: i de first og last, for at demonstrere at det er netop pga. tl: tagget, for når de er væk validerer den fint.

Hvordan kan jeg få den til at validere korrekt at de type definationer er i tl targetspacet?
Avatar billede jlykkegaard Nybegynder
08. oktober 2005 - 22:58 #1
jeg løste problemet selv, jeg skulle også have de komplekse typer erklæret i typelib name space, og lade dem indeholde type referencer til samme dokument hvor de simple typer er erklæret, og derefter også referere den komplekse type der bliver erklæret i catalog namespace med type til typelibnamespacet, selv om at den "bor" i catalognamespacet. Og de ikke komplekse typer skulle refereres med en ref.

Jeg ligger løsningen her, det kan være at nogen kan bruge den som et eksempel med flere namespaces i .xsd, da jeg ikke selv har kunnet finde nogen med tilhørende xml data.

xml filen:
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2006 U (http://www.altova.com) by Sigurdur Palsson (Vejle hs) -->
<catalog xmlns="CATALOG" xmlns:gr="Group" xmlns:ct="CATALOG" xmlns:tl="TYPELIBNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="CATALOG Catalog.xsd">
    <contact contactId="1" nationality="gb" gender="male">
        <ct:name>
            <tl:first>John</tl:first>
            <tl:last>Milton</tl:last>
        </ct:name>
        <ct:address>
            <tl:street>2, Main Street</tl:street>
            <tl:city>Nottingham</tl:city>
            <tl:postalCode>34566</tl:postalCode>
            <tl:country>England</tl:country>
        </ct:address>
        <tl:phone>+44 6765645</tl:phone>
        <tl:email>john.milton@work.com</tl:email>
    </contact>
    <contact contactId="2" nationality="us" gender="male">
        <ct:name>
            <tl:first>Sam</tl:first>
            <tl:last>DoLittle</tl:last>
        </ct:name>
        <ct:address>
            <tl:street>111, Relaxed Ave</tl:street>
            <tl:city>Chicago</tl:city>
            <tl:postalCode>10167</tl:postalCode>
            <tl:stateRegion>Illinois</tl:stateRegion>
            <tl:country>USA</tl:country>
        </ct:address>
    </contact>
    <contact contactId="3" married="true" children="2" gender="male">
        <ct:name>
            <tl:first>Steven</tl:first>
            <tl:last>Wilson</tl:last>
        </ct:name>
        <tl:phone>+1 6348364</tl:phone>
    </contact>
    <!--
Demonstration:  Change contactId to one that is defined already!
-->
    <contact contactId="4" gender="female">
        <ct:name>
            <tl:first>Claire</tl:first>
            <tl:middle>Marie</tl:middle>
            <tl:last>Watson</tl:last>
        </ct:name>
        <ct:address>
            <tl:street>32, Queen Street</tl:street>
            <tl:city>Toronto</tl:city>
            <tl:postalCode>M6G 3X1</tl:postalCode>
            <tl:stateRegion>Ontario</tl:stateRegion>
            <tl:country>Canada</tl:country>
        </ct:address>
        <tl:phone>+1 6765513</tl:phone>
    </contact>
    <gr:personGroup title="work">
        <!-- Definition af en "kaffeklub" -->
-
    <gr:personGroup title="marketing">
-
    <!--
Demonstration:  Change refContactId to a non existing value of contactId!
-->
            <gr:contactReference refContactId="1"/>
            <gr:contactReference refContactId="4"/>
        </gr:personGroup>
-
    <gr:personGroup title="development">
            <gr:contactReference refContactId="3"/>
        </gr:personGroup>
    </gr:personGroup>
    <gr:personGroup title="private">
        <!-- Definition af en "syklub" -->
        <gr:contactReference refContactId="2"/>
        <gr:contactReference refContactId="5"/>
        <gr:contactReference refContactId="1"/>
    </gr:personGroup>
</catalog>

catalog.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2006 U (http://www.altova.com) by Sigurdur Palsson (Vejle hs) -->
<xs:schema xmlns:ct="Contact" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tl="TYPELIBNS" xmlns:ns="CATALOG" targetNamespace="CATALOG" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:import namespace="CONTACT" schemaLocation="contactType.xsd"/>
    <xs:import namespace="TYPELIBNS" schemaLocation="TypeLib.xsd"/>
    <xs:element name="catalog">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="contact" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="name" type="tl:name"/>
                            <xs:element minOccurs="0" name="address" type="tl:address"/>
                            <xs:element minOccurs="0" ref="tl:phone"/>
                            <xs:element minOccurs="0" ref="tl:email"/>
                        </xs:sequence>
                        <xs:attributeGroup ref="ns:contactAttributes"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
   
    <xs:attributeGroup name="contactAttributes">
                    <xs:attribute name="contactId" type="xs:string"/>
                        <xs:attribute name="nationality" type="xs:string"/>
                        <xs:attribute name="gender" type="xs:string"/>
                        <xs:attribute name="married" type="xs:string"/>
                        <xs:attribute name="children" type="xs:string"/>
    </xs:attributeGroup>
</xs:schema>

typelib.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tl="TYPELIBNS" targetNamespace="TYPELIBNS" elementFormDefault="qualified" attributeFormDefault="qualified">

    <xs:complexType name="name">
        <xs:sequence>
            <xs:element name="first" type="tl:first"/>
            <xs:element name="middle" type="tl:middle" minOccurs="0"/>
            <xs:element name="last" type="tl:last"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="address">
        <xs:sequence>
            <xs:element name="street" type="tl:street"/>
            <xs:element name="city" type="tl:city"/>
            <xs:element name="postalCode" type="tl:postalCode"/>
            <xs:element name="stateRegion" type="tl:stateRegion" minOccurs="0"/>
            <xs:element name="country" type="tl:country"/>
        </xs:sequence>
    </xs:complexType>
   
        <xs:element name="phone" type="tl:phone"/>
    <xs:element name="email" type="tl:email"/>
   
    <xs:simpleType name="street">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="city">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="postalCode">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="country">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="first">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="middle">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="last">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="phone">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="email">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
    <xs:simpleType name="stateRegion">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
   
</xs:schema>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester