使用列表反序列化xml

时间:2013-11-11 15:27:32

标签: c# xml deserialization

我想将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)

2 个答案:

答案 0 :(得分:1)

我试图从你的xml中生成一个类。 一开始我从你的xml

生成了一个xsd
<?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. 在Visual Studio中打开XML
  2. 选择包含XML的标签。在主菜单中选择XML / Create Schema。 (工作室会打开你的计划文件)
  3. 使用xsd.exe util。 (http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx
  4. 在某些情况下,我正在使用xsd进行以下技巧:

    当我知道我的文档schmema可以在开发周期中更改时:

    我正在将XSD文件添加到我的项目中。 在项目文件中,我将添加以下部分

    <PropertyGroup>
        <WIN_SDK_PATH>$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows@CurrentInstallFolder)</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文件。

答案 1 :(得分:1)

假设您正在尝试一种标准的反序列化方法,问题是XML没有标准的字符串列表,而是一个“选项”列表。

如果它使用标准的.NET字符串列表,结果将如下所示:

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