J
Jeremy
I've built a class that uses the IXmlSerializable interface to do custom
serialization. I"ve then used the IXmlSerializable.GetSchema() method to
output the schema of my class to the wsdl in my web service. The problem is
that the schema of my class appears in a seperate schema element in the
wsdl. It needs to be in the main schema element so that an application can
consume the web service properly, because I've found that at least with .net
apps, they only consume the first schema element. How can I get only one
schema element in the wsdl?
I've included my class and the wsdl snippets below:
My Class:
public class AnyTextData2 : AnyTextData,
System.Xml.Serialization.IXmlSerializable
{
public AnyTextData2()
{
}
System.Xml.Schema.XmlSchema
System.Xml.Serialization.IXmlSerializable.GetSchema()
{
/*
<s:complexType name="AnyTextData2">
<s:simpleContent>
<s:extension base="s:string">
<s:attribute name="Attribute" type="s:string" />
</s:extension>
</s:simpleContent>
</s:complexType>
*/
System.Xml.Schema.XmlSchema pSchema = new
System.Xml.Schema.XmlSchema();
pSchema.ElementFormDefault =
System.Xml.Schema.XmlSchemaForm.Qualified;
pSchema.Id = "0"; //Seems an id is mandatory
//<s:complexType name="CData">
System.Xml.Schema.XmlSchemaComplexType pComplexType = new
System.Xml.Schema.XmlSchemaComplexType();
pComplexType.Name = "AnyTextData2";
//<xs:simpleContent>
System.Xml.Schema.XmlSchemaSimpleContent pSimpleContent = new
System.Xml.Schema.XmlSchemaSimpleContent();
//<s:extension base="s:string">
System.Xml.Schema.XmlSchemaSimpleContentExtension pExtension = new
System.Xml.Schema.XmlSchemaSimpleContentExtension();
pExtension.BaseTypeName = new
System.Xml.XmlQualifiedName("string");//"s:string"
//<s:attribute name="Attribute" type="s:string" />
System.Xml.Schema.XmlSchemaAttribute pAttribute = new
System.Xml.Schema.XmlSchemaAttribute();
pAttribute.Name = "Attribute";
pAttribute.SchemaTypeName = new
System.Xml.XmlQualifiedName("string");//"s:string"
pExtension.Attributes.Add(pAttribute);
pSimpleContent.Content = pExtension;
pComplexType.ContentModel = pSimpleContent;
pSchema.Items.Add(pComplexType);
return pSchema;
}
void
System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader
reader)
{
}
void
System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter
writer)
{
writer.WriteAttributeString("Attribute", this.Attribute);
writer.WriteCData(this.Text.Data);
}
}
WSDL snippets:
<?xml version="1.0" encoding="utf-8" ?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://tempuri.org/" xmlns:s1="http://tempuri2.org/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://tempuri.org/">
...
</s:schema>
<s:schema elementFormDefault="qualified"
targetNamespace="http://tempuri2.org/" id="0">
<s:complexType name="AnyTextData2">
<s:simpleContent>
<s:extension base="string">
<s:attribute name="Attribute" type="string" />
</s:extension>
</s:simpleContent>
</s:complexType>
</s:schema>
</wsdl:types>
</wsdl:definitions>
serialization. I"ve then used the IXmlSerializable.GetSchema() method to
output the schema of my class to the wsdl in my web service. The problem is
that the schema of my class appears in a seperate schema element in the
wsdl. It needs to be in the main schema element so that an application can
consume the web service properly, because I've found that at least with .net
apps, they only consume the first schema element. How can I get only one
schema element in the wsdl?
I've included my class and the wsdl snippets below:
My Class:
public class AnyTextData2 : AnyTextData,
System.Xml.Serialization.IXmlSerializable
{
public AnyTextData2()
{
}
System.Xml.Schema.XmlSchema
System.Xml.Serialization.IXmlSerializable.GetSchema()
{
/*
<s:complexType name="AnyTextData2">
<s:simpleContent>
<s:extension base="s:string">
<s:attribute name="Attribute" type="s:string" />
</s:extension>
</s:simpleContent>
</s:complexType>
*/
System.Xml.Schema.XmlSchema pSchema = new
System.Xml.Schema.XmlSchema();
pSchema.ElementFormDefault =
System.Xml.Schema.XmlSchemaForm.Qualified;
pSchema.Id = "0"; //Seems an id is mandatory
//<s:complexType name="CData">
System.Xml.Schema.XmlSchemaComplexType pComplexType = new
System.Xml.Schema.XmlSchemaComplexType();
pComplexType.Name = "AnyTextData2";
//<xs:simpleContent>
System.Xml.Schema.XmlSchemaSimpleContent pSimpleContent = new
System.Xml.Schema.XmlSchemaSimpleContent();
//<s:extension base="s:string">
System.Xml.Schema.XmlSchemaSimpleContentExtension pExtension = new
System.Xml.Schema.XmlSchemaSimpleContentExtension();
pExtension.BaseTypeName = new
System.Xml.XmlQualifiedName("string");//"s:string"
//<s:attribute name="Attribute" type="s:string" />
System.Xml.Schema.XmlSchemaAttribute pAttribute = new
System.Xml.Schema.XmlSchemaAttribute();
pAttribute.Name = "Attribute";
pAttribute.SchemaTypeName = new
System.Xml.XmlQualifiedName("string");//"s:string"
pExtension.Attributes.Add(pAttribute);
pSimpleContent.Content = pExtension;
pComplexType.ContentModel = pSimpleContent;
pSchema.Items.Add(pComplexType);
return pSchema;
}
void
System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader
reader)
{
}
void
System.Xml.Serialization.IXmlSerializable.WriteXml(System.Xml.XmlWriter
writer)
{
writer.WriteAttributeString("Attribute", this.Attribute);
writer.WriteCData(this.Text.Data);
}
}
WSDL snippets:
<?xml version="1.0" encoding="utf-8" ?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:tns="http://tempuri.org/" xmlns:s1="http://tempuri2.org/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://tempuri.org/">
...
</s:schema>
<s:schema elementFormDefault="qualified"
targetNamespace="http://tempuri2.org/" id="0">
<s:complexType name="AnyTextData2">
<s:simpleContent>
<s:extension base="string">
<s:attribute name="Attribute" type="string" />
</s:extension>
</s:simpleContent>
</s:complexType>
</s:schema>
</wsdl:types>
</wsdl:definitions>