2008-10-22 28 views
51

Vì vậy, tôi có xml trông như thế này: deserializing XML to Objects trong C#

<todo-list> 
    <id type="integer">#{id}</id> 
    <name>#{name}</name> 
    <description>#{description}</description> 
    <project-id type="integer">#{project_id}</project-id> 
    <milestone-id type="integer">#{milestone_id}</milestone-id> 
    <position type="integer">#{position}</position> 

    <!-- if user can see private lists --> 
    <private type="boolean">#{private}</private> 

    <!-- if the account supports time tracking --> 
    <tracked type="boolean">#{tracked}</tracked> 

    <!-- if todo-items are included in the response --> 
    <todo-items type="array"> 
    <todo-item> 
     ... 
    </todo-item> 
    <todo-item> 
     ... 
    </todo-item> 
    ... 
    </todo-items> 
</todo-list> 

Làm thế nào tôi sẽ đi về việc sử dụng thư viện serialization NET để deserialize này vào C# đối tượng?

Hiện tại tôi đang sử dụng sự phản chiếu và tôi ánh xạ giữa xml và đối tượng của tôi bằng cách sử dụng quy ước đặt tên.

Trả lời

57

Tạo một lớp cho mỗi phần tử có thuộc tính cho từng phần tử và Danh sách hoặc Mảng đối tượng (sử dụng một đối tượng được tạo) cho mỗi phần tử con. Sau đó gọi System.Xml.Serialization.XmlSerializer.Deserialize trên chuỗi và truyền kết quả làm đối tượng của bạn. Sử dụng thuộc tính System.Xml.Serialization để thực hiện điều chỉnh, như ánh xạ phần tử tới lớp ToDoList của bạn, sử dụng thuộc tính XmlElement ("todo-list").

Một shourtcut là tải XML của bạn vào Visual Studio, nhấp vào nút "Infer Schema" và chạy "xsd.exe/c schema.xsd" để tạo các lớp. xsd.exe nằm trong thư mục công cụ. Sau đó đi qua các mã được tạo ra và thực hiện điều chỉnh, chẳng hạn như thay đổi quần short để ints khi thích hợp.

+2

Trong VS2010, nó được gọi là 'Tạo lược đồ' và có thể tạo nhiều tệp xsd (một tệp cho mỗi không gian tên). Trong trường hợp đó, bao gồm những người trong lệnh, tức là chạy "xsd.exe/c schema.xsd schema1.xsd" (v.v.). –

+5

Trong VS 2012 và sau đó, bạn cũng có "Dán XML dưới dạng Lớp học" trong menu Chỉnh sửa. –

+4

'Chỉnh sửa> Dán Đặc biệt> Dán XML thành Lớp 'Rất hay, @JonathanAllen, chính xác những gì tôi cần. – JMD

31

Boils xuống để sử dụng xsd.exe từ các công cụ trong VS:

xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%" 

Sau đó tải nó với người đọc và deserializer:

public GeneratedClassFromXSD GetObjectFromXML() 
{ 
    var settings = new XmlReaderSettings(); 
    var obj = new GeneratedClassFromXSD(); 
    var reader = XmlReader.Create(urlToService, settings); 
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(GeneratedClassFromXSD)); 
    obj = (GeneratedClassFromXSD)serializer.Deserialize(reader); 

    reader.Close(); 
    return obj; 
} 
+1

+1 liên kết tốt, đã lưu nhiều dòng mã –

+1

Hmmm, trong ví dụ tôi giả định rằng biến 'urlToService' đại diện cho XML được tuần tự hóa? Và biến đó có phải là một đối số cho 'GetObjectFromXML()' không? – DavidRR

3

Có một vài tùy chọn khác nhau.

  • Visual Studio bao gồm chương trình dòng lệnh có tên xsd.exe. Bạn sử dụng chương trình đó để tạo tài liệu lược đồ và sử dụng lại chương trình trên tài liệu lược đồ để tạo các lớp bạn có thể sử dụng với system.xml.serialization.xmlserializer
  • Bạn chỉ có thể gọi Dataset.ReadXml() trên đó.
4

Vâng, bạn phải có các lớp học trong lắp ráp của bạn phù hợp, gần như, XML (thuộc tính được gọi là Private, một thuộc tính bộ sưu tập được gọi là ToDo, v.v.).

Vấn đề là XML có các thành phần không hợp lệ đối với tên lớp. Vì vậy, bạn phải thực hiện IXmlSerializable trong các lớp này để kiểm soát cách chúng được tuần tự hóa và từ XML. Bạn có thể thoát khỏi bằng cách sử dụng một số thuộc tính cụ thể xml hóa tuần tự, nhưng điều đó phụ thuộc vào lược đồ xml của bạn.

Đó là một bước trên bằng cách sử dụng sự phản chiếu, nhưng nó có thể không chính xác những gì bạn đang mong đợi.

4

Thanh toán http://xsd2code.codeplex.com/

Xsd2Code là một CSharp hoặc Visual Basic Business Entity lớp Generator từ giản đồ XSD.

+0

@Deepfreezed: vui lòng cung cấp thêm chi tiết. Làm thế nào điều này sẽ giải quyết được vấn đề trong câu hỏi này. Có thể hiển thị ví dụ về mã sử dụng công cụ. –

+0

Đầu tiên tôi tạo lược đồ XSD cho XML bằng cách sử dụng VS. Sau đó, tôi chạy công cụ tạo mã ở trên. Điều này tạo ra một lớp/đối tượng mà tôi có thể sử dụng để tuần tự hóa XML. Công cụ này tích hợp với VS 2008/2010. Nó cũng có một số tính năng tốt đẹp như bộ sưu tập chung chung. – Deepfreezed

14

Deserialize bất kỳ đối tượng, miễn là loại T được đánh dấu Serializable:

function T Deserialize<T>(string serializedResults) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    using (var stringReader = new StringReader(serializedResults)) 
     return (T)serializer.Deserialize(stringReader); 
} 
+0

Thay vì 'Deserialize (chuỗi s)', bạn có nghĩa là 'Deserialize (string serializedResults)'? – DavidRR

+0

Đã sửa lỗi. Cảm ơn bạn @DavidRR! – Keith

-1

tôi đã có những câu hỏi tương tự vài năm trở lại rằng cách abt mapping xml đến các lớp họC# C hoặc tạo lớp C# được ánh xạ tới chúng tôi XML, jst như chúng ta làm trong khung thực thể (chúng ta ánh xạ các bảng tới các lớp C#). Cuối cùng, tôi đã tạo một khung công tác, có thể tạo các lớp C# trong XML của bạn và các lớp này có thể được sử dụng để đọc/ghi xml của bạn. Có một số look