2013-09-04 44 views
12

Tôi có một đơn XElement tìm kiếm như thế này:Chuyển đổi XElement duy nhất để phản đối

<row flag="1" sect="" header="" body="" extrainfo="0" /> 

Sau đó, tôi có một lớp học như thế này:

public class ProductAttribute 
{ 
    public string Flag { get; set; } 
    public string Sect { get; set; } 
    public string Header { get; set; } 
    public string Body { get; set; } 
    public string Extrainfo { get; set; } 
} 

Làm thế nào tôi có thể chuyển đổi XElement này vào một đối tượng ProductAttribute ?

Trả lời

13

Bạn phải đặt tuần tự đúng các thuộc tính trên lớp và lớp các thành viên của bạn

[Serializable()] 
[XmlRoot(ElementName = "row")] 
public class ProductAttribute 
{ 
    [XmlAttribute("flag")] 
    public string Flag { get; set; } 
    [XmlAttribute("sect")] 
    public string Sect { get; set; } 
    [XmlAttribute("header")] 
    public string Header { get; set; } 
    [XmlAttribute("body")] 
    public string Body { get; set; } 
    [XmlAttribute("extrainfo")] 
    public string Extrainfo { get; set; } 
} 
+1

Giải pháp tốt nhất cho đến nay, nếu nó hoạt động. Nhưng tôi nhận được: 'Thuộc tính System.Xml.Serialization.XmlElementAttribute không hợp lệ trên loại khai báo này. Nó có hiệu lực trên các khai báo 'thuộc tính, trường, tham số, ReturnValue' chỉ – Numm3n

+1

@ Numm3n Oups, nên được XmlRoot chỉnh sửa câu trả lời của tôi – jbl

5

Các bạn đã thử:

XElement element = //Your XElement 
var serializer = new XmlSerializer(typeof(ProductAttribute)); 
(ProductAttribute)serializer.Deserialize(element.CreateReader()) 
+0

Có, tôi đã thử nhưng tôi chỉ nhận được: ' không được mong đợi.' – Numm3n

+0

Bạn nên đặt các thuộc tính tuần tự chính xác trên lớp ProductAttribute. Giống như XmlElement cho lớp và XmlAttribute cho mỗi thuộc tính. – Alberto

+0

Cảm ơn. Nhưng tôi không được phép đặt '[XmlElement (" row ")]' vào lớp. 'Attribute System.Xml.Serialization.XmlElementAttribute không hợp lệ trên kiểu khai báo này. Nó chỉ hợp lệ trên các khai báo 'Property, Field, Parameter, ReturnValue' chỉ – Numm3n

1

Điều này có vẻ khá dễ dàng (ít nhất mà không kiểm tra lỗi ...):

var res = new ProdicAttribute { 
    Flag = (string)element.Attribute("flag"), 
    Sect = (string)element.Attribute("sect"), 
    ... 
} 
+0

Đây là bản đồ thủ công. Nhưng nếu tôi có XElement với 200 thuộc tính thì sao? Tôi đã hy vọng rằng C# /. Net sẽ có một giải pháp đơn giản – Numm3n

+0

Bắt các thuộc tính serialization XML ngay là không tầm thường (và tôi thấy nó dễ bị lỗi) ... Tôi không thấy điều này như bất kỳ công việc nhiều hơn nữa. Cộng với nó giúp với tách mối quan tâm :-). – Richard

0
var element = XElement.Parse("<row flag="1" sect="" header="" body="" extrainfo="0" />"); 

var productAttribute = new ProductAttribute { 
    Flag = (string)element.Attribute("flag"), 
    Sect = (string)element.Attribute("sect"), 
    Header = (string)element.Attribute("header"), 
    Body = (string)element.Attribute("body"), 
    Extrainfo = (string)element.Attribute("extrainfo") 
}; 

Nhưng tôi không nghĩ rằng tất cả ProductAttribute thuộc tính của lớp nên được nhập là string.

3

tôi sẽ thêm một constructor mà mất trong một XElement.

public class ProductAttribute 
{ 
    public string Flag { get; set; } 
    public string Sect { get; set; } 
    public string Header { get; set; } 
    public string Body { get; set; } 
    public string Extrainfo { get; set; } 

    public ProductAttribute(XElement xElement){ 
     Flag = (string)element.Attribute("flag"); 
     Sect = (string)element.Attribute("sect").Value; 
     Header = (string)element.Attribute("header ").Value; 
     Body = (string)element.Attribute("body").Value; 
     Extrainfo = (string)element.Attribute("extrainfo").Value; 
    } 
} 

Sau đó, bạn chỉ có thể gọi

var productAttribute = new ProductAttribute(element); 

Nếu bạn muốn chắc rằng năng động, bạn có thể sử dụng phản ánh được những tài sản trên lớp sau đó vòng qua sau đó và tìm kiếm trên XElement cho thuộc tính mà sau đó thiết lập đó tài sản nhiều trong cùng một cách. Tuy nhiên tôi sẽ giữ nó đơn giản vì đối tượng không phức tạp.

7

Bạn có thể làm theo cách này:

1) Lúc đầu, bạn nên cung cấp cho các thuộc tính vào trong lớp:

[XmlRoot("row")] 
public class ProductAttribute 
{ 
    [XmlAttribute("flag")] 
    public string Flag { get; set; } 
    [XmlAttribute("sect")] 
    public string Sect { get; set; } 
    [XmlAttribute("header")] 
    public string Header { get; set; } 
    [XmlAttribute("body")] 
    public string Body { get; set; } 
    [XmlAttribute("extrainfo")] 
    public string Extrainfo { get; set; } 
} 

2) Bây giờ bạn có thể deserialize XElement của bạn hoặc chuỗi xml đơn giản như thế này:

ProductAttribute productAttribute = new ProductAttribute(); 
XElement xElement = XElement.Parse(
"<row flag='1' sect='3' header='4444' body='3434' extrainfo='0' />"); 

//StringReader reader = new StringReader(
//"<row flag='1' sect='3' header='4444' body='3434' extrainfo='0' />"); 

StringReader reader = new StringReader(xElement.ToString()); 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ProductAttribute)); 
productAttribute = (ProductAttribute)xmlSerializer.Deserialize(reader); 

Tôi hy vọng nó sẽ giúp bạn.