3

キャメルケース文字列からブール型をシリアル化する際の問題を解決する方法を見つけようとしています。

私は次のxmlを持っています

<Root>
  <BoolElement>
     False
  </BoolElement>
</Root>

そして次のクラス

[XmlRoot("Root")]
public class RootObj{
  [XmlElement("BoolElement")]
  public bool BoolElement{get;set;}
}

これはエラーになります。

同じクラスを使用して「False」の名前を「false」に変更すると、機能します。問題は、xml を編集できないことです。

どうすればこれを解決できるか知っている人はいますか?

4

3 に答える 3

7

この無効なXMLの逆シリアル化を支援するためにバッキングフィールドを使用できます(xsd:booleanスキーマによるとFalse無効な値であるため無効と言います):

[XmlRoot("Root")]
public class RootObj
{
    [XmlElement("BoolElement")]
    public string BackingBoolElement
    {
        set
        {
            BoolElement = bool.Parse(value.ToLower());
        }
        get
        {
            return BoolElement.ToString();
        }
    }

    [XmlIgnore]
    public bool BoolElement { get; set; }
}
于 2012-05-09T07:50:34.747 に答える
4

Falseはxsd:booleanの有効な値ではありません(ただし、注意false0てください)-ソースデータを変更できない場合は、純粋にXMLシリアル化用に別のプロパティを使用できます。

[XmlRoot("Root")]
public class RootObj{
  [XmlElement("BoolElement")]
  public string BoolElementForSerialization
  {
     get
     {
         return (this.BoolElement ? "True" : "False");
     }
     set
     {
         this.BoolElement = (string.Compare(value, "false", StringComparison.OrdinalIgnoreCase) != 0);
     }
  }

  [XmlIgnore]
  public bool BoolElement{get;set;}
}
于 2012-05-09T07:51:22.487 に答える