13

一部のXMLをWebサービスからC#POCOに逆シリアル化しようとしています。必要なほとんどのプロパティでこれが機能していますが、要素が存在するかどうかに基づいてboolプロパティを設定する必要がありますが、これを行う方法がわかりませんか?

XMLスニペットの例:

<someThing test="true">
    <someThingElse>1</someThingElse>
    <target/>
</someThing>

C#クラスの例:

[Serializable, XmlRoot("someThing")]
public class Something
{
    [XmlAttribute("test")]
    public bool Test { get; set; }

    [XmlElement("someThingElse")]
    public int Else { get; set; }

    /// <summary>
    /// <c>true</c> if target element is present,
    /// otherwise, <c>false</c>.
    /// </summary>   
    [XmlElement("target")]
    public bool Target { get; set; }
}

これは、私が処理している実際のXMLとオブジェクト階層の非常に単純化された例ですが、私が達成しようとしていることを示しています。

null /空の要素の逆シリアル化に関連して私が読んだ他のすべての質問は、の使用に関係しているようですがNullable<T>、これは私が必要とすることを行いません。

誰かアイデアはありますか?

4

2 に答える 2

15

これを行う1つの方法は、別のプロパティを使用して要素の値を取得し、次にTargetプロパティを使用してその要素が存在するかどうかを取得することです。そのようです。

[XmlElement("target", IsNullable = true)]
public string TempProperty { get; set; }

[XmlIgnore]
public bool Target
{
    get
    {
        return this.TempProperty != null;
    }
}

空の要素が存在する場合でも、TempPropertyはnullにならないため、存在するtrue場合はTargetが返されます<target />

于 2012-05-15T14:12:00.047 に答える
0

null許容型を使用したくない理由を説明できますか?
uがurpocoでint(int?ではなく)プロパティを定義する場合、それは実際には基になるxmlを表さず、uはそれらの変数のデフォルト値を取得するだけです。
ur xmlで値0の空/ヌルの文字列または整数を取得しないと仮定した場合は、各urプロパティに対してBalthyが提案した方法を使用するか、ここで説明する方法を使用できます。


一般に、クラスで基になるデータを本当に表現したい場合は、null許容型を使用しながら、ur xmlを記述するスキーマを作成し、それに基づいてクラスを生成することをお勧めします。

于 2012-05-15T14:19:15.970 に答える