2012-05-15 9 views
9

Próbuję deserializować niektóre XML z usługi sieci Web do C# POCO. Mam to działa dla większości właściwości, których potrzebuję, jednak muszę ustawić właściwość bool na podstawie tego, czy element jest obecny, czy nie, ale nie może zobaczyć, jak to zrobić?Deserializować obecność elementów XML w celu Bool w C#

urywek przykład XML:

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

Przykładem C# klasa:

[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; } 
} 

To bardzo uproszczony przykład rzeczywistej hierarchii XML i obiektów Jestem przetwarzania, ale pokazuje, co ja Próbuję osiągnąć.

Wszystkie inne pytania, które przeczytałem, dotyczące deserializacji pustych elementów, wydają się wymagać użycia Nullable<T>, która nie spełnia moich oczekiwań.

Czy ktoś ma jakieś pomysły?

Odpowiedz

12

Jednym ze sposobów jest użycie innej właściwości, aby uzyskać wartość elementu, a następnie użycie właściwości Target, aby sprawdzić, czy dany element istnieje. Jak tak.

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

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

Ponieważ nawet jeśli pusty element istnieje, TempProperty nie będzie zerowy, więc docelowa powróci true jeśli <target /> istnieje

+0

Dzięki, przemilczaliśmy to :) –

0

Czy możesz wyjaśnić, dlaczego nie chcesz używać zerowalne typów?
Po zdefiniowaniu właściwości int (w przeciwieństwie do int?) W ur poco, tak naprawdę nie reprezentuje ona bazowego xml, a po prostu otrzymamy domyślne wartości dla tych zmiennych.
jeśli u Zakładam, że przyzwyczajenie się pustych/null łańcuchy lub liczby całkowite o wartości 0 w ur xml, youcan stosować metodę Balthy sugerowane dla każdego ur właściwości lub use the method described here


Ogólnie myślę, że jest lepszy pomysł Aby utworzyć schemat opisywania ur xml i generowania klas na jego podstawie, używając typów zerowalnych, jeśli naprawdę chcesz, aby twoje klasy reprezentowały podstawowe dane.

+0

Próbuję deserializować wyniki z Google Search Appliance. Element '' jest obecny w elemencie '', jeśli wyniki są automatycznie filtrowane i nie są obecne, jeśli nie są. Potrzebuję ustawić właściwość, aby wskazać, czy zestaw wyników jest filtrowany czy nie - nie widzę, w jaki sposób zerowy bool pomoże w tym przypadku? –

+0

Nullables, które są używane w takim przypadku są dla właściwości tiself, a nie boolean, która oznacza, czy jest pusty/zerowy czy nie. jeśli nie dbasz o zawartość FI i chcesz tylko sprawdzić, czy tam jest, czy nie, wtedy metoda balthys wykona zadanie. Funkcje nullable powinny być używane do bardziej zaawansowanych scenariuszy, gdy wartość, którą chcesz sprawdzić, to liczba lub cokolwiek innego, które otrzyma wartość domyślną, niepustą, w przypadku użycia klasy ur. IF był typem liczbowym, powiedzmy liczbą całkowitą, i używał int FI w klasie ur, zawsze miał wartość 0, która NIE jest równa zeru. – YavgenyP

+0

Dzięki, rozumiem, do czego służą Nullable. Jednak w tym kontekście nie byłyby one lepsze niż użycie dowolnego typu o niskiej wartości z prostym sprawdzaniem zerowym, które sugeruje Balthy. Element '' nigdy nie ma wartości - jest to po prostu obecność elementu, który reprezentuje coś. Tak więc wartość 'Nullable ' zawsze będzie miała wartość 'default (T)' lub wartość null. –