2013-11-11 3 views
-1

Я десериализации XML в список и простой строки:десериализации XML со списком

<GeneralTranslation> 
    <Day>Day</Day> 
    <Month>Month</Month> 
    <Year>Year</Year> 
    <Submit>Submit</Submit> 
    <Select>Please select</Select> 

    <TradingExp> 
     <Option>Less than a year</Option> 
     <Option>1-2 years</Option> 
     <Option>3-5 years</Option> 
     <Option>Above 5 years</Option> 
    </TradingExp> 

    <LevelOfInvestment> 
     <Option>Less than 5K</Option> 
     <Option>Between 5K and 15K</Option> 
     <Option>Between 15K and 50K</Option> 
     <Option>Above 50KK</Option> 
    </LevelOfInvestment> 
</GeneralTranslation> 

в этом: (есть в любом случае, чтобы сделать его в список, не делая это вручную?)

[XmlRoot("GeneralTranslation")] 
public class GeneralTrnaslation 
{ 
    public string Day { get; set; } 
    public string Month { get; set; } 
    public string Year { get; set; } 
    public string Above { get; set; } 
    public string Select { get; set; } 
    public string Submit { get; set; } 
    public List<string> LevelOfInvestment { get; set; } 
    public List<string> TradingExp { get; set; } 
} 

это то, что я придумал, все работы, кроме списка:

(GeneralTrnaslation)serializer.Deserialize(streamTrans) 
+0

нет. некоторая работа по-прежнему требуется –

+0

@hmnzr - я добавил код, который я пробовал. спасибо – SexyMF

+0

@YaugenVlasau - может быть, вы предлагаете лучшую структуру данных вместо списка? возможно, измените структуру xml? спасибо – SexyMF

ответ

1

Предполагая, что вы пытаетесь использовать стандартный метод десериализации, проблема заключается в том, что XML не имеет стандартного списка строк, а список «Option».

Если используют стандартные .NET списки строк, результаты будут выглядеть следующим образом:

<LevelOfInvestment> 
    <string>test1</string> 
    <string>test2</string> 
</LevelOfInvestment> 
1

Я попытался генерироваться класс от вашего XML. В начале я сгенерировал XSD с вашего XML

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="GeneralTranslation"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Day" type="xs:string" /> 
     <xs:element name="Month" type="xs:string" /> 
     <xs:element name="Year" type="xs:string" /> 
     <xs:element name="Submit" type="xs:string" /> 
     <xs:element name="Select" type="xs:string" /> 
     <xs:element name="TradingExp"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element maxOccurs="unbounded" name="Option" type="xs:string" /> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="LevelOfInvestment"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element maxOccurs="unbounded" name="Option" type="xs:string" /> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

затем с помощью утилиты XSD Я создал следующий класс

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
    public partial class GeneralTranslation { 

     private string dayField; 

     private string monthField; 

     private string yearField; 

     private string submitField; 

     private string selectField; 

     private string[] tradingExpField; 

     private string[] levelOfInvestmentField; 

     /// <remarks/> 
     public string Day { 
      get { 
       return this.dayField; 
      } 
      set { 
       this.dayField = value; 
      } 
     } 

     /// <remarks/> 
     public string Month { 
      get { 
       return this.monthField; 
      } 
      set { 
       this.monthField = value; 
      } 
     } 

     /// <remarks/> 
     public string Year { 
      get { 
       return this.yearField; 
      } 
      set { 
       this.yearField = value; 
      } 
     } 

     /// <remarks/> 
     public string Submit { 
      get { 
       return this.submitField; 
      } 
      set { 
       this.submitField = value; 
      } 
     } 

     /// <remarks/> 
     public string Select { 
      get { 
       return this.selectField; 
      } 
      set { 
       this.selectField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlArrayItemAttribute("Option", IsNullable=false)] 
     public string[] TradingExp { 
      get { 
       return this.tradingExpField; 
      } 
      set { 
       this.tradingExpField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlArrayItemAttribute("Option", IsNullable=false)] 
     public string[] LevelOfInvestment { 
      get { 
       return this.levelOfInvestmentField; 
      } 
      set { 
       this.levelOfInvestmentField = value; 
      } 
     } 
    } 
} 

так отсюда вы можете получить строковые массивы, но не перечисляют

ниже есть как-к:

  1. Откройте XML в визуальной S tudio
  2. Выберите вкладку с вашим XML. В главном меню выберите XML/Create Schema. (студия откроет вам файл схемы)
  3. использование xsd.exe util. (http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx)

в некоторых случаях я делаю следующий трюк с XSD-х годов:

, когда я знаю, что мой документ schmema может быть изменен во время цикла разработки:

Я добавляю файл XSD в мой проект. В файле проекта я добавляю в следующих разделах

<PropertyGroup> 
    <WIN_SDK_PATH>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\[email protected])</WIN_SDK_PATH> 
    <WIN_SDK_BIN_PATH>$(WIN_SDK_PATH)bin</WIN_SDK_BIN_PATH> 
    <XSDUTIL>"$(WIN_SDK_BIN_PATH)\xsd.exe"</XSDUTIL> 
    </PropertyGroup> 
    <Target Name="XSD2CS"> 
    <Exec Command="$(XSDUTIL) &quot;$(ProjectDir)XMLSchema1.xsd&quot; /classes /out:&quot;$(ProjectDir)obj&quot; /namespace:$(RootNamespace).XSD" /> 
    </Target> 
    <Target Name="BeforeBuild" DependsOnTargets="XSD2CS"> 
    </Target> 

и еще один раздел в том, что содержат мои файлы проекта

<Compile Include="$(ProjectDir)obj\XMLSchema1.cs"> 
    <SubType>Code</SubType> 
</Compile> 

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

+0

Не могли бы вы поделиться, как вы это сделали? возможно, ссылку на учебник? спасибо – Shazam

+0

2Shazam: Я добавляю ответ –

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