-1

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)
4

2 に答える 2

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. XML を Visual Studio で開く
  2. XML を含むタブを選択します。メイン メニューで [XML/スキーマの作成] を選択します。(スタジオがスキーム ファイルを開きます)
  3. xsd.exe ユーティリティを使用します。( http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx )

場合によっては、xsd で次のトリックを実行しています。

開発サイクル中にドキュメント スキーマを変更できることがわかっている場合:

プロジェクトに 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>

プロジェクト ファイルを含む のもう 1 つのセクション

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

プロジェクトをコンパイルするたびに、xsd の最新の実際のバージョンに対応するクラスを取得しています。したがって、私が世話をする必要があるのは、正しい完全な xsd ファイルだけです。

于 2013-11-11T15:49:57.893 に答える
1

逆シリアル化の標準的な方法を試していると仮定すると、問題は XML に文字列の標準リストがなく、「オプション」のリストがあることです。

文字列の標準 .NET リストを使用している場合、結果は次のようになります。

 <LevelOfInvestment>
    <string>test1</string>
    <string>test2</string>
 </LevelOfInvestment>
于 2013-11-11T15:51:15.383 に答える