Reputation: 25
I'm trying to a update an existing schema to use its own namespace, so I can import it into another schema later and make it clear the types being used are from the imported schema.
I tried changing the default and targeted namespaces but it's caused the schema validation to break and hide the root node. From what I can see i've hidden my root element in another namespace but I am unsure how to configure this to get my desired result.
Here is a basic example of what I've tried
XML
<Parent Id="P">
<Child Id="C"/>
</Parent>
XSD
<xsd:schema targetNamespace="http://myNameSpace.com"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://myNameSpace.com"
elementFormDefault="qualified" >
<xsd:element name="Child">
<xsd:complexType>
<xsd:attribute name="Id" />
</xsd:complexType>
</xsd:element>
<xsd:element name="Parent">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Child" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="Id" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Validation
Not valid.
Error - Line 1, 19: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 19; cvc-elt.1: Cannot find the declaration of element 'Parent'.
Upvotes: 1
Views: 3157
Reputation: 111491
You need to make a few changes to your XML:
xmlns="http://myNameSpace.com"
to P
.xsi:schemaLocation
to provide a hint to the XSD to
use.And to your XSD:
Child
declaration from the Parent
declaration.Altogether then, this XML,
<?xml version="1.0" encoding="UTF-8"?>
<Parent Id="P"
xmlns="http://myNameSpace.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://myNameSpace.com try.xsd">
<Child Id="C"/>
</Parent>
will then be valid against this XSD,
<xsd:schema targetNamespace="http://myNameSpace.com"
xmlns:m="http://myNameSpace.com"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" >
<xsd:element name="Child">
<xsd:complexType>
<xsd:attribute name="Id" />
</xsd:complexType>
</xsd:element>
<xsd:element name="Parent">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="m:Child" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="Id" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
as requested.
Upvotes: 1
Reputation: 4120
when you have namespace in XSD you must have it in XML as well.
So, your XML must look like:
<Parent Id="P" xmlns="http://myNameSpace.com">
<Child Id="C"/>
</Parent>
Or if you'd like to use prefix:
<mysp:Parent Id="P" xmlns:mysp="http://myNameSpace.com">
<mysp:Child Id="C"/>
</mysp:Parent>
Upvotes: 0