2009-10-13 32 views
8

Tôi đã làm việc với một dịch vụ web dựa trên REST của bên thứ 3 dựa trên java, trả về một mảng các xmlNodes.xmlNode đến các đối tượng

The xmlNode [] resprentent một đối tượng và tôi đang cố gắng để làm việc ra cách tốt nhất để Deserialize xmlNode [] trong đối tượng? là nó để xây dựng một xmlDocument đầu tiên và Deserialize?

Cảm ơn

Trả lời

22

Nếu bạn đã cài đặt Kit preview WCF Rest Starter, có một mẹo gọn gàng:

  • mở Visual Studio
  • chọn nội dung nút XML của bạn (XML tạo nên một trong những nút của bạn) và sao chép nó vào clipboard
  • từ "Edit" thực đơn của bạn trong Visual Studio, chọn "Paste XML như loại"

này sẽ dán XML của bạn đó là vào clipboard vào dự án của bạn như là một lớp C# đó là có khả năng deserializing XML chính xác đó. Khá tiện lợi!

Xem các bài đăng trên blog về nó:

Điều đó sẽ giúp bạn tiết kiệm rất nhiều đánh máy và làm cho cuộc sống dễ dàng hơn rất nhiều!

CẬP NHẬT:
OK, bạn đã tạo các lớp học từ XML bạn lấy lại. Bây giờ bạn cần phải chuyển đổi một số XmlNode thành lớp học của bạn.

Bạn sẽ phải làm một cái gì đó như thế này:

private static T ConvertNode<T>(XmlNode node) where T: class 
{ 
    MemoryStream stm = new MemoryStream(); 

    StreamWriter stw = new StreamWriter(stm); 
    stw.Write(node.OuterXml); 
    stw.Flush(); 

    stm.Position = 0; 

    XmlSerializer ser = new XmlSerializer(typeof(T)); 
    T result = (ser.Deserialize(stm) as T); 

    return result; 
} 

Bạn cần phải viết các đại diện XML (tài sản .OuterXml) của XmlNode đến một dòng (ở đây một MemoryStream) và sau đó sử dụng XmlSerializer serialize quay trở lại đối tượng từ luồng đó.

Bạn có thể làm điều đó với phương pháp chung chung và gọi

Customer myCustomer = ConvertNode<Customer>(xmlNode); 

hoặc thậm chí bạn có thể biến mã mà vào hoặc là một phương pháp khuyến nông trên lớp XmlNode vì vậy bạn có thể viết:

Customer myCustomer = xmlNode.ConvertNode<Customer>(); 

Marc

+0

Xin chào, tôi đã có các đối tượng từ xsd nên tôi thực sự không thực hiện bước này. Tôi muốn tìm hiểu whats cách tốt nhất để đi từ xmlNodes [] (đối tượng serialized). – 76mel

-1

Cách đơn giản nhất để làm điều này sẽ được sử dụng xây dựng trong lớp System.Xml.Serialization.XmlSerializer trong .NET. Tìm kiếm trên XmlSerializer trên Google sẽ cung cấp nhiều hướng dẫn mà bạn có thể sử dụng để tìm hướng dẫn phù hợp với mình.

+1

Rõ ràng và không hữu ích. Tất nhiên tôi cần XMLSerializer, nhưng tôi có một nút XML chứ không phải một chuỗi hoặc một luồng. May mắn thay, tìm kiếm google cung cấp câu trả lời hữu ích khác cho câu hỏi này – edc65

4

Có thể quá muộn để trả lời ở đây nhưng sẽ giúp ích cho người khác:

Đây là giải pháp bạn sẽ có thể Deserialize từ nút XML.

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 

XmlNode xmlNode = xmlDoc.SelectSingleNode("//SystemInfo"); 

XmlSerializer serial = new XmlSerializer(typeof(SystemInfo)); 

SystemInfo syso =(SystemInfo)serial.Deserialize(new XmlNodeReader(xmlNode)); 

tải đầu tiên XML để XmlDocument Object và sau đó tìm nút cha bạn sẽ muốn deserialize giống như tôi muốn nút đối tượng SystemInfo từ tất cả các tài liệu xml.

Khi bạn thấy rằng tạo đối tượng XmlSerializer với loại lớp cụ thể bạn sẽ muốn.

Bây giờ chỉ cần vượt qua new XmlNodeReader(xmlNode) đến Deserialize phương pháp, bạn sẽ nhận được các đối tượng dân cư trong đối tượng một lớp giống như tôi cư syso đối tượng với giá trị XML.

Mã hóa hạnh phúc :)

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