Boolean_Type
Boolean_Type

Reputation: 1274

Unqualified XML-element with prefixed namespace inside

I have the following XML:

<ns1:verifySignedDocumentResponse xmlns:ns1="http://signing.ws.comarch.gov">
    <verifySignedDocumentReturn xmlns:ns2="http://exception.ws.comarch.gov">Some string content...</verifySignedDocumentReturn>
</ns1:verifySignedDocumentResponse>

In verifySignedDocumentReturn case I'm wondering, is it correct to define the prefix (xmlns:ns2=...), but not to qualify (ns2:verifySignedDocumentReturn) the appropriate element with this prefix?

w3schools.com gives examples, which show:

  1. If element is prefixed, namespace for the prefix must be defined.
  2. Element should't be prefixed, if default namespace is used.

But in my example there is no default namespace. So, I expect verifySignedDocumentReturn to be prefixed with ns2.

I've got this XML-snippet from real service, so I wonder: is it correct and valid? Or just service creators' carelessness? I ask, because I'm new to XML/XSD.

I've tried to generate XSD from this XML with different online-generators, but no generated schema looks reasonable.

Variant 1 (does not take into account ns2 namespace at all):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified" 
           targetNamespace="http://signing.ws.comarch.gov" 
           xmlns:ns1="http://signing.ws.comarch.gov">
   <xs:element name="verifySignedDocumentResponse">
   <xs:complexType>
      <xs:sequence>
        <xs:element name="verifySignedDocumentReturn" form="unqualified" 
                    type="xs:string"/>
      </xs:sequence>
   </xs:complexType>
 </xs:element>

Variant 2:

schema0.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:ns1="http://signing.ws.comarch.gov" 
           xmlns:ns2="http://exception.ws.comarch.gov" 
           attributeFormDefault="unqualified" 
           elementFormDefault="qualified" 
           targetNamespace="http://signing.ws.comarch.gov" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="schema1.xsd" />
  <xs:element name="verifySignedDocumentResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="verifySignedDocumentReturn" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

schema1.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="verifySignedDocumentReturn" type="xs:string" />
</xs:schema>

Upvotes: 2

Views: 241

Answers (1)

Sprotty
Sprotty

Reputation: 5973

The first thing to note is the declaration of xmlns:ns2="http://exception.ws.comarch.gov" in your XML document does nothing. Its just defining an alias ns2, which is never used.

Both the generated schemas look OK. A few notes about them though.

Although the first schema fits neatly in a single XSD, typically the elementFormDefault is set to qualified and not changed within the schema. In this schema the form is being set to unqualified for the inner element. I'm not 100% sure, but I think that a validating XML parser using this schema will treat verifySignedDocumentReturn as if its in the namespace "http://signing.ws.comarch.gov". I think changing the form in the middle of a XSD document is asking for incompatibility issues.

The second set of schemas look OK.

Upvotes: 1

Related Questions