views:

363

answers:

2

Hey,

I'm working on a XML Editor which gets all his information from the corresponding XSD file. To work with the XSD files I use the System.Xml.Schema Namespace (XmlSchema*). Because of an 'xsi:type' attribute in the XML I've to change the XmlSchemaType of an XmlSchemaElement. Until now I use in my code the 'ElementSchemaType' property of 'XmlSchemaElement'. The nice thing about it: it's read only.

There is also in 'XmlSchemaElement' an 'SchemaType' property which is not read only, but always null (yes, XmlSchema and XmlSchemaSet are compiled).

So how can I change the type of the 'XmlSchemaElement'? Or, also the same question: What is the diffrence between this two porperties?

Some technical data: C#, .NET 3.5

The MSDN documentation is nearly the same for both:

SchemaType Documentation:

Gets or sets the type of the element. This can either be a complex type or a simple type.

ElementSchemaType Documentation:

Gets an XmlSchemaType object representing the type of the element based on the SchemaType or SchemaTypeName values of the element.

A: 

Ok, I found a (bad) solution with Reflection:

private static string XML_SCHEMA_ELEMENT_SET_ELEMENT_TYPE_MEMBER_NAME = "SetElementType";

public static void ChangeElementType(this XmlSchemaElement element, XmlSchemaType type)
{
        element.GetType().InvokeMember(XML_SCHEMA_ELEMENT_SET_ELEMENT_TYPE_MEMBER_NAME,
            BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
            null, element, new object[] { type });
}

I did an analysis wit .NET Reflector and they have two properties which hold an 'XmlSchemaType'. One, not read only, is for XML serialization (it has Xml* attributes) and the other one, which is read only, is as I think for post compile use - so it's more or less "static" information. The nice thing about this great design: You can't cleanly read an XSD, change some parts and save it again. Ok, I don't testet it, but this is what the Code tells me.

So here are the interesting source code parts of 'XmlSchemaElement':

private XmlSchemaType elementType;
// ...
private XmlSchemaType type;
// ...
[XmlIgnore]
public XmlSchemaType ElementSchemaType
{
    get
    {
        return this.elementType;
    }
}
// ...
[XmlElement("complexType", typeof(XmlSchemaComplexType)), XmlElement("simpleType", typeof(XmlSchemaSimpleType))]
public XmlSchemaType SchemaType
{
    get
    {
        return this.type;
    }
    set
    {
        this.type = value;
    }
}
// ...
internal void SetElementType(XmlSchemaType value)
{
    this.elementType = value;
}
Gregor
A: 

Can you show an example how did you use this?

I tried it, but still in WSDL it writes it as type not as message!

Arian