18

要素の1つに空白の属性があるxmlがあります。たとえば、

<tests>
<test language="">
.....
</test>
</tests>

現在、言語はスキーマから作成されたクラスの列挙型です。言語が指定されている場合は正常に機能し、空白の場合は逆シリアル化に失敗します(例を参照)。

編集:逆シリアル化のコード:

XmlSerializer xmlserializer = new XmlSerializer(type);
StringReader strreader = new StringReader(stringXML);
Object o = serializer.Deserialize(strreader);

このシナリオをどのように処理できますか

4

5 に答える 5

21

enumプロパティをnull許容として宣言できます。

public Language? Language { get; set; }


編集:わかりました、私はちょうど試しました、それは属性に対しては機能しません...ここに別のオプションがあります:このプロパティを直接シリアル化/逆シリアル化せず、代わりに文字列プロパティをシリアル化します:

[XmlIgnore]
public Language Language { get; set; }

[XmlAttribute("Language")]
public string LanguageAsString
{
    get { return Language.ToString(); }
    set
    {
        if (string.IsNullOrEmpty(value))
        {
            Language = default(Language);
        }
        else
        {
            Language = (Language)Enum.Parse(typeof(Language), value);
        }
    }
}
于 2010-11-22T22:28:44.197 に答える
18

おそらく、列挙をマークアップし、不明を表すデフォルトのアイテムを追加する必要があります。

例えば:

Public Enum EmployeeStatus
   <XmlEnum("")> Unknown = 0
   <XmlEnum("Single")> One = 1
   <XmlEnum("Double")> Two = 2
   <XmlEnum("Triple")> Three = 3
End Enum

詳細については、こちらを参照してください。

于 2010-11-22T22:41:23.037 に答える
17

あなたはこのようにそれを行うことができます:

namespace Example
{

   public enum Language
   {
     [XmlEnum("en")]
     English,

     [XmlEnum("de")]
     Deutsch
   }

   public class ExampleClass
   {

      private Language? language;

      [XmlAttribute("Language")]
      public Language Language
      {
         get { return language ?? Example.Language.English; }
         set { language = value; }
      }

      .
      .
      .
   }
}
于 2011-08-30T14:36:04.343 に答える
2

結果をどうしたいですか?

列挙型はnull許容でない値型であるため、空白値をnull参照にマップすることはできません。

于 2010-11-22T22:11:25.413 に答える
0
object wontBeNull = couldBeNull ?? defaultIfNull;

私が試してみたいものです。これはNull合体演算子と呼ばれます。null入力のデフォルトが必要な場合に使用します。

于 2010-11-22T22:28:14.990 に答える