Missing schema targetNamespace=\"\".

I am trying to serialize an object that implements the IXmlSerializable interface and has the XmlSchemaProvider attribute but I keep getting the an exception thrown with the message "Missing schema targetNamespace=\"\"." when I try and serialize an object that contains my object.

Here's the code I'm using to generate the schema:

public static XmlQualifiedName CreateSchema(XmlSchemaSet xs)

{

XmlSchema schema = new XmlSchema();

schema.Id = "PresentationSchema";

schema.TargetNamespace = "http://www.w3.org/2001/XMLSchema";

XmlSchemaComplexType root = new XmlSchemaComplexType();

root.Name = "Presentation";

XmlSchemaSequence rootSeq = new XmlSchemaSequence();

root.Particle = rootSeq;

XmlSchemaComplexType indexElement = new XmlSchemaComplexType();

indexElement.Name = "Indexes";

XmlSchemaElement indexRef = new XmlSchemaElement();

indexRef.RefName = new XmlQualifiedName("Indexes", "http://www.w3.org/2001/XMLSchema");

rootSeq.Items.Add(indexRef);

XmlSchemaSequence ids = new XmlSchemaSequence();

ids.MinOccurs = 0;

ids.MaxOccursString = "unbounded";

XmlSchemaElement idRef = new XmlSchemaElement();

idRef.SchemaTypeName = new XmlQualifiedName("integer","http://www.w3.org/2001/XMLSchema");

idRef.Name = "ID";

ids.Items.Add(idRef);

indexElement.Particle = ids;

schema.Items.Add(root);

schema.Items.Add(indexElement);

return new XmlQualifiedName("Presentation");

}

And it produces this schema:

< xml version="1.0" encoding="utf-8" >
<xs:schema targetNamespace="http://www.w3.org/2001/XMLSchema" id="PresentationSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Presentation">
<xs:sequence>
<xs:element ref="xs:Indexes" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Indexes">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="ID" type="xs:integer" />
</xs:sequence>
</xs:complexType>
</xs:schema>

Can somebody please tell me what is going wrong here These schema are very confusing.

Thanks



Answer this question

Missing schema targetNamespace=\"\".

  • rokohl

    In your CreateSchema() method, you should add the schema of your object to the XmlSchemaSet parameter that is passed in. You are missing the following line in your code:

    xs.Add(null, schema);

    As a side note, it is not recommended to specify targetNamespace of your custom schema as the W3C schema namespace(http://www.w3.org/2001/XMLSchema) as it means that you are extending the Schema for Schema. You should change your targetNamespace attribute to something like "MyPresentationSchema".

    Thanks,

    Priya


  • Rey_S2006

    If the targetNamespace is not the default namespace in your schema, you have to namespace qualify all references to type names, element names etc

    indexRef.SchemaTypeName = new XmlQualifiedName("IndexType"); should be

    indexRef.SchemaTypeName = new XmlQualifiedName("IndexType", "MyPresentationSchema");

    and the above change should change this <xs:element name="Indexes" type="IndexType" /> to

    <xs:element name="Indexes" type="tns:IndexType" />

    Thanks,

    Priya


  • Mullvaden

    Thanks for your reply. That seems to have fixed that particular problem. I've changed the code around a bit, but now I'm getting this error:

    Schema type information provided by IXmlSerializable is invalid: Type 'IndexType' is not declared.

    Here's the code now:

    public static XmlQualifiedName CreateSchema(XmlSchemaSet xs)

    {

    XmlSchema schema = new XmlSchema();

    schema.Id = "PresentationSchema";

    schema.TargetNamespace = "MyPresentationSchema";

    XmlSchemaComplexType root = new XmlSchemaComplexType();

    root.Name = "Presentation";

    XmlSchemaSequence rootSeq = new XmlSchemaSequence();

    root.Particle = rootSeq;

    XmlSchemaComplexType indexElement = new XmlSchemaComplexType();

    indexElement.Name = "IndexType";

    XmlSchemaElement indexRef = new XmlSchemaElement();

    indexRef.SchemaTypeName = new XmlQualifiedName("IndexType");

    indexRef.Name = "Indexes";

    rootSeq.Items.Add(indexRef);

    XmlSchemaSequence ids = new XmlSchemaSequence();

    ids.MinOccurs = 0;

    ids.MaxOccursString = "unbounded";

    XmlSchemaElement idRef = new XmlSchemaElement();

    idRef.SchemaTypeName = new XmlQualifiedName("integer","http://www.w3.org/2001/XMLSchema");

    idRef.Name = "ID";

    ids.Items.Add(idRef);

    indexElement.Particle = ids;

    schema.Items.Add(indexElement);

    schema.Items.Add(root);

    xs.Add(schema);

    return new XmlQualifiedName("Presentation");

    }

    Which produces this schema:

    < xml version="1.0" encoding="utf-8" >
    <xs:schema xmlns:tns="MyPresentationSchema" targetNamespace="MyPresentationSchema" id="PresentationSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="IndexType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
    <xs:element name="ID" type="xs:integer" />
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Presentation">
    <xs:sequence>
    <xs:element name="Indexes" type="IndexType" />
    </xs:sequence>
    </xs:complexType>
    </xs:schema>

    Which seems fine to me because it defines 'IndexType'.

    Any ideas

    Thanks


  • Missing schema targetNamespace=\"\".