Removing class deserialization from XML generated using XSD.exe

I have classes generated (using xsd.exe) from .xsd that can be serialized just fine, but when I try and deserialize it I get the error:

{"<XMLLanguages xmlns='http://tempuri.org/XMLLanguages.xsd'> was not expected."}

      

I searched for a couple of hours and found that most people's problems are that they don't declare namespaces in xsd / xml, don't define namespaces in their classes, etc., but I can't seem to find a solution for my problem.

Below are the code snippets for the respective classes.

    <?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLLanguages"
    targetNamespace="http://tempuri.org/XMLLanguages.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLLanguages.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="XMLLanguages">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Tier" minOccurs="1" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="L" minOccurs="1" maxOccurs="unbounded" type="Language"/>
            </xs:sequence>
            <xs:attribute name="TierID" type="xs:int"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Language">
    <xs:sequence>
      <xs:element name="LangID" type="xs:int"/>
      <xs:element name="Tier" type="xs:int"/>
      <xs:element name ="Name" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name ="PassRate" type="xs:int"/>
  </xs:complexType>
</xs:schema>

      

And the class:

    /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://tempuri.org/XMLLanguages.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://tempuri.org/XMLLanguages.xsd", IsNullable = false)]
public partial class XMLLanguages
{
    private List<XMLLanguagesTier> tierField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Tier")]
    public List<XMLLanguagesTier> Tiers {
        get {
            return this.tierField;
        }
        set {
            this.tierField = value;
        }
    }
}

      

And the line in XML throws an error:

<XMLLanguages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/XMLLanguages.xsd">

      

Deserialization method:

public static object Deserialize(XmlDocument xml, Type type)
    {
        XmlSerializer s = new XmlSerializer(type);
        string xmlString = xml.OuterXml.ToString();
        byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlString);
        MemoryStream ms = new MemoryStream(buffer);
        XmlReader reader = new XmlTextReader(ms);
        Exception caught = null;

        try
        {
            object o = s.Deserialize(reader);
            return o;
        }

        catch (Exception e)
        {
            caught = e;
        }
        finally
        {
            reader.Close();

            if (caught != null)
                throw caught;
        }
        return null;
    }

      

+2


a source to share


2 answers


I am using the following code and it works great.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Report"
           targetNamespace="http://www.xyz.com/Report.xsd"
           elementFormDefault="qualified"
           xmlns="http://www.xyz.com/Report.xsd"
           xmlns:mstns="http://www.xyz.com/Report.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Report">
  <xs:complexType>
  ...

      

I am using xsd.exe with the / n: xyz namespace option.



Everything seems to be working fine, so my guess is that your problem must be related to the tempuri.org domain name.

Hope this helps.

Richard.

0


a source


You need to remove the targetNamespace attribute from the root and add the following node before the XMLLanguages ​​node:

<xs:import namespace="http://www.w3.org/2001/XMLSchema"/>

      



The above will allow you to deserialize, but I feel other problems are on the horizon. The problem you ran into was that when defining multiple complex types, you cannot use the targetNamespace attribute - welcome to the hell object namespace ...

0


a source







All Articles