2013-03-15 28 views
7

Tôi biết tôi có thể sử dụng LINQ để ánh xạ các trường từ XML sang các trường trong một đối tượng đã tồn tại từ trước. Có bất kỳ chức năng nào trong Khuôn khổ .NET (hoặc các thư viện khác) làm cho hướng dẫn này ít hơn không.C# - Hydrate đối tượng hiện có với XML

Tôi muốn viết (và có HydrateFromXml cư xử một chút như AutoMapper không):

var myObject = new MyObject(/*ctor args*/); 

myObject = myObject.HydrateFromXml(string xml); 

Edit:

Tôi có thể sử dụng mô hình trang trí hoặc một đối tượng wrapper đơn giản ở đây? Deserialize trực tiếp vào một loại được bọc bởi một trừu tượng cho phép kiểm soát xây dựng hạt mịn tôi cần?

+1

Tôi đã làm đôi chút tương tự như các thuộc tính với thuộc tính tuần tự hóa. Sau đó viết một phương thức phản ánh các thuộc tính được đánh dấu và sau đó tìm hiểu xung quanh trong xml cho nội dung để đặt chúng. Nói rằng giả sử không có chéo giữa constrcutor args và Hydration, waht về revesing nó. Sử dụng serialization để có được một sau đó thiết lập các arguemnts constructor? –

+0

Tôi có thể tìm hiểu xem "hydrate" có nghĩa là gì trong bối cảnh này? –

+0

@KennethK. Tôi nghĩ đó là điểm mấu chốt của vấn đề. Tôi muốn các thuộc tính trên 'myObject' được khởi tạo với các giá trị tương ứng trong XML, nhưng làm như vậy có nghĩa là cho chương trình biết cách thực hiện nó. Tôi đang tìm kiếm thứ gì đó không liên quan đến các trường ánh xạ thủ công, nhưng có vẻ như điều này là không thể. – Ben

Trả lời

5

Bạn có thể sử dụng XmlSerializer để làm điều đó:

var serializer = new XmlSerializer(typeof(MyObject)); 

object result; 
using (TextReader reader = new StringReader(xml)) 
{ 
    result= serializer.Deserialize(reader); 
} 

var myObject = result as MyObject; 

Đối với một tình huống khi bạn đối tượng dụ đã tồn tại kiểm tra câu hỏi này: Deserializing properties into a pre-existing object

+0

Không cần 'as' ở dòng cuối cùng - nó sẽ chỉ là một' MyObject', vì vậy bạn chỉ có thể truyền. –

+2

Điều này dường như không trả lời được câu hỏi của tôi vì 'kết quả' không tồn tại trước bước deserialization. Tôi muốn hydrate một thể hiện đối tượng đã tồn tại từ trước. – Ben

+0

Vì vậy, bạn không có khai báo 'MyObject'? – MarcinJuraszek

1

Là một lựa chọn nhanh chóng, bạn có thể sử dụng AutoMapper. Sử dụng XmlSerializer để deserialize vào một cá thể mới và sau đó sử dụng AutoMapper để ánh xạ từ cá thể mới được tạo ra đến cá thể yêu cầu của bạn.

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