2010-05-04 2 views
2

У меня есть классы, порожденные (с использованием xsd.exe) из XSD-что я могу сериализировать просто отлично, но когда я пытаюсь и десериализации его, я получаю сообщение об ошибке:десериализация классы из XML сгенерированы с помощью Xsd.exe

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

Я искал пару часов и обнаружил, что проблемы большинства людей заключаются в том, что они не объявляют пространства имен в xsd/xml, не определяя пространства имен в своих классах и т. Д., Но я не могу найти решение для своей проблемы.

Вот фрагменты кода для соответствующих классов.

<?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> 

А класс:

/// <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; 
     } 
    } 
} 

И строка в XML вызывает ошибку:

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

метод десериализации:

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; 
    } 
+0

Можете ли вы показать нам, что фрагмент кода действительно делает десериализацию ?? Вы обращаете внимание на пространство имен XML «http://tempuri.org/XMLLanguages.xsd» и включаете его в код десериализации? –

+0

отредактировал это. – heap

ответ

0

Я использую следующий код и он отлично работает.

<?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> 
    ... 

Я использую xsd.exe с опцией/n: xyz namespace.

Это похоже на работу, поэтому я предполагаю, что ваша проблема должна быть связана с доменным именем tempuri.org.

Надеюсь, это поможет.

Richard.

+0

Домен tempuri является доменом по умолчанию для xsd-файлов в VS2010, я попробовал другой домен со свежими xml-файлами, и ошибка идентична, за исключением нового домена. – heap

+0

Я думал, что проблема может заключаться в том, что классы не были определены как находящиеся в том же пространстве имен, что и xml, поэтому изменили пространство имен на все одинаковые. Все еще не работает. Свойство NamespaceURI XmlDocument, однако, является «", я не уверен, что это проблема. – heap

0

Вы должны удалить атрибут TargetNamespace от корня, и добавьте следующий узел перед узлом XMLLanguages:

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

выше позволит вам десериализацию, но я чувствую, другие проблемы на горизонте. Проблема, с которой вы столкнулись, заключалась в том, что когда вы определяете несколько сложных типов, вы не можете использовать атрибут targetNamespace - добро пожаловать в схему namespace hell ...

Смежные вопросы