2012-05-15 34 views
9

Tôi đang cố gắng deserialize một số XML từ một dịch vụ web vào C# POCOs. Tôi đã có này làm việc cho hầu hết các tài sản tôi cần, tuy nhiên, tôi cần phải thiết lập một tài sản bool dựa trên việc liệu một phần tử có mặt hay không, nhưng dường như không thể nhìn thấy làm thế nào để làm điều này?Deserialize hiện diện phần tử XML để bool trong C#

Một đoạn dụ XML:

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

Một ví dụ C# lớp:

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

Đây là một ví dụ rất đơn giản của XML và đối tượng phân cấp thực tế tôi chế biến, nhưng thể hiện những gì tôi đang cố gắng đạt được.

Tất cả các câu hỏi khác mà tôi đã đọc liên quan đến deserializing các phần tử rỗng/rỗng dường như liên quan đến việc sử dụng Nullable<T>, không làm những gì tôi cần.

Có ai có ý tưởng nào không?

Trả lời

12

Một cách để thực hiện việc này là sử dụng thuộc tính khác để lấy giá trị của phần tử, sau đó sử dụng thuộc tính Mục tiêu để xem liệu phần tử đó có tồn tại hay không. Như vậy.

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

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

Như ngay cả khi một phần tử rỗng tồn tại, TempProperty sẽ không được null, vì vậy mục tiêu sẽ trở lại true nếu <target /> tồn tại

+0

Cảm ơn, đã quá tải về nó :) –

0

bạn có thể giải thích lý do tại sao bạn không muốn sử dụng các loại nullable?
Khi u xác định thuộc tính int (như trái ngược với int?) Trong ur poco, nó không thực sự đại diện cho xml cơ bản và u sẽ chỉ nhận các giá trị mặc định cho các biến đó.
NẾU u giả sử bạn sẽ không nhận được các khóa trống/chuỗi null hoặc số nguyên với giá trị 0 trong ur xml, youcan sử dụng phương pháp Balthy gợi ý cho mỗi tài sản ur, hoặc use the method described here


Nói chung tôi nghĩ rằng một ý tưởng tốt hơn của nó để tạo một lược đồ để mô tả xml ur và tạo các lớp dựa trên nó, trong khi sử dụng các kiểu nullable, nếu bạn thực sự muốn các lớp của bạn đại diện cho dữ liệu cơ bản.

+0

Tôi đang deserializing kết quả từ Google Search Appliance. Phần tử '' hiện diện trong phần tử '' nếu kết quả được lọc tự động và không hiển thị nếu chúng không có. Tôi cần đặt thuộc tính để biểu thị xem tập hợp kết quả có được lọc hay không - Tôi không thấy cách bool có thể vô hiệu hóa sẽ trợ giúp trong trường hợp này? –

+0

Các nullables được sử dụng trong trường hợp này là dành cho thuộc tính, không phải là boolean đánh dấu nếu rỗng/null của nó hay không. nếu bạn không quan tâm đến nội dung của FI và chỉ muốn kiểm tra xem nó có hay không, thì phương pháp balthys sẽ thực hiện công việc. Nullable properites nên được sử dụng cho scenarions nâng cao hơn, khi giá trị tồn tại u muốn kiểm tra là một số hoặc bất cứ điều gì khác mà sẽ nhận được một giá trị mặc định, không null, trong trường hợp của lớp ur bằng cách sử dụng. IF là một kiểu số, nói số nguyên, và bạn muốn sử dụng int FI trong lớp ur nó luôn luôn có giá trị là 0, không phải là giống như null. – YavgenyP

+0

Cảm ơn, tôi hiểu những gì Nullable dành cho. Tuy nhiên, trong bối cảnh này, họ sẽ không tốt hơn việc sử dụng bất kỳ loại không có giá trị nào với kiểm tra null đơn giản mà Balthy gợi ý. Phần tử '' không bao giờ có giá trị - chỉ đơn giản là sự hiện diện của phần tử đại diện cho một cái gì đó. Vì vậy, giá trị của 'Nullable ' sẽ luôn là 'mặc định (T)' hoặc null. –

Các vấn đề liên quan