2011-12-17 5 views
1

Я пытаюсь десериализовать с наследованием.Использование наследования в десериализации XML

К примеру, у меня есть класс для opensearch

В ближайшее время XSD, как это:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://a9.com/-/spec/opensearch/1.1/" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="OpenSearchDescription"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="ShortName" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Mozilla impements this но они используют свои собственные схемы.

поэтому у них есть:

<?xml version="1.0" encoding="Windows-1252"?> 
<xs:schema xmlns:os="http://a9.com/-/spec/opensearch/1.1/" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.mozilla.org/2006/browser/search/" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:import namespace="http://a9.com/-/spec/opensearch/1.1/" /> 
    <xs:element name="SearchPlugin"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="os:ShortName" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Для OpenSearch У меня есть класс, как

[SerializableAttribute] 
[XmlRoot(Namespace = "http://a9.com/-/spec/opensearch/1.1/", IsNullable = false, ElementName = "OpenSearchDescription")] 
public class OpenSearch 
{ 
    public string ShortName { get; set; } 
} 

Это прекрасно работает, когда я пытаюсь deserialise в XML ...

Для моей реализации MOZILLA Я просто хочу что-то вроде этого:

[System.SerializableAttribute] 
[XmlRoot(Namespace = "http://www.mozilla.org/2006/browser/search/", IsNullable = false, ElementName = "SearchPlugin")] 
public class SearchPlugin 
{ 
    public OpenSearch OpenSearch { get; set; } 
} 

однако, всякий раз, когда я пытаюсь десериализировать объект SearchPlugin, объект OpenSearch имеет значение NULL.

Как я могу это сделать? Я попытался создать пример для себя, создав код с помощью xsd.exe, однако я также продолжаю получать ошибки, когда пытаюсь сгенерировать код для SearchPlugin.xsd, так что это не помогло ...

ответ

4

Я бы начал с XML, который вы пытаетесь десериализовать, получить файлы XSD из этого XML, при необходимости настроить XSD, чтобы убедиться, что они действительны, а затем использовать xsd.exe для генерации классов. Посмотрев на сгенерированные классы, вы увидите, чего не хватает.

Кто-то на самом деле используется для способов Xsd.exe был бы сразу отметить, что свойство OpenSearch класса SearchPlugin не имеет XmlElementAttribute, что-то вроде

[System.Xml.Serialization.XmlElementAttribute(Namespace="http://a9.com/-/spec/opensearch/1.1/")] 

Я считаю, что это причина, почему вы получаете нулевой. Ниже приводится описание того, как я буду устранять неполадки ...

Начиная с XML; на основе ваших схем и класса, я бы предположить, что вы ожидали что-то вроде ниже:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<SearchPlugin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:os="http://a9.com/-/spec/opensearch/1.1/" xmlns="http://www.mozilla.org/2006/browser/search/"> 
    <os:OpenSearchDescription> 
     <os:ShortName>ShortName1</os:ShortName> 
    </os:OpenSearchDescription> 
</SearchPlugin> 

Диаграмма XSD хотел бы это:

Mozilla SearchPlugin diagram

Что означает, что вы можете использовать эти XSDs :

<?xml version="1.0" encoding="Windows-1252"?> 
<xs:schema xmlns:os="http://a9.com/-/spec/opensearch/1.1/" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.mozilla.org/2006/browser/search/" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:import namespace="http://a9.com/-/spec/opensearch/1.1/" schemaLocation="OpenSearch.xsd"/> 
    <xs:element name="SearchPlugin"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="os:OpenSearchDescription"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

OpenSearch.xsd является тем, который вы опубликовали.

Если вы запустите xsd.exe, вы получите этот результат:

C:\.....>xsd MozillaOpenSearch.xsd OpenSearch.xsd /classes 
Microsoft (R) Xml Schemas/DataTypes support utility 
[Microsoft (R) .NET Framework, Version 4.0.30319.1] 
Copyright (C) Microsoft Corporation. All rights reserved. 
Writing file 'C:\....\OpenSearch.cs'. 

Сгенерированный класс:

using System.Xml.Serialization; 

// 
// This source code was auto-generated by xsd, Version=4.0.30319.1. 
// 


/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true,  Namespace="http://www.mozilla.org/2006/browser/search/")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.mozilla.org/2006/browser/search/", IsNullable=false)] 
public partial class SearchPlugin { 

    private OpenSearchDescription openSearchDescriptionField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Namespace="http://a9.com/-/spec/opensearch/1.1/")] 
    public OpenSearchDescription OpenSearchDescription { 
     get { 
      return this.openSearchDescriptionField; 
     } 
     set { 
      this.openSearchDescriptionField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://a9.com/-/spec/opensearch/1.1/")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://a9.com/-/spec/opensearch/1.1/", IsNullable=false)] 
public partial class OpenSearchDescription { 

    private string shortNameField; 

    /// <remarks/> 
    public string ShortName { 
     get { 
      return this.shortNameField; 
     } 
     set { 
      this.shortNameField = value; 
     } 
    } 
} 
Смежные вопросы