2009-11-18 28 views
5

Tôi gặp sự cố khi deserialise XML này:Làm thế nào tôi có thể deserialise một phần tử XML thành một mảng các yếu tố với cả hai thuộc tính và văn bản trong C#?

<?xml version="1.0" encoding="UTF-8"?> 
<links> 
    <link title="ABC">http://abc.co.uk</link> 
    <link title="eBay">http://ebay.co.uk</link> 
    <link title="Best Damn Site on the Web">http://stackoverflow.com</link> 
</links> 

Sử dụng mã:

[XmlRoot("links")] 
public class LinksInterface 
{ 
    [XmlElement("link")] 
    public List<LinkElement> Links; 

    public class LinkElement 
    { 
     [XmlAttribute("title")] 
     public string Title; 
     [XmlText] // This bit is the troublesome bit! 
     public LinkElement Link; 
    } 
} 

Về cơ bản, tôi cần phải đặt nội dung văn bản của nguyên tố này vào Links.Link nhưng thuộc tính tôi cố gắng [XmlText] không cung cấp hành vi tôi mong đợi và tôi gặp lỗi:

Đã xảy ra lỗi khi phản ánh trường 'Liên kết'..

Nếu có ai có thể chỉ ra lỗi của con đường của tôi, tôi sẽ biết ơn nhất!

Cảm ơn.

Trả lời

5

Có lẽ chỉ cần sử dụng string:

[XmlText] 
public string Link {get;set;} 

Tại thời điểm này lớp là đệ quy (một cây) - Tôi không nghĩ rằng đó là những gì bạn dự định.

(Tôi cũng chuyển sang một tài sản, nhưng đó không phải là vấn đề - string là có vấn đề gì, nhưng có nhiều lý do để sử dụng tài sản thay vì lĩnh vực, và với khả năng tự tài sản (C# 3.0) có có vài lý do không để)


Chỉnh sửa: đồng thời, hãy thử nhìn vào ngoại lệ bên trong nhất; trong trường hợp này, thông điệp là:

Cannot serialize member 'Link' of type LinksInterface.LinkElement. XmlAttribute/XmlText cannot be used to encode complex types.

Điều đó mang lại một dấu hiệu hợp lý nơi mà vấn đề là ;-p

+0

Doh! Được phát hiện độc đáo Marc :) – Ryall

+0

Cũng được thay đổi thành thuộc tính thay vì trường. Cảm ơn vì lời khuyên. – Ryall

+0

Bỏ qua -1 ... nhấp vào mũi tên xuống do nhầm lẫn, sẽ không cho phép tôi tải lên lại ... Xin lỗi: S – Ryall

0

Kiểm tra bài viết này XML Serialization in C#. Tác giả sử dụng bộ getter/setter để thêm các mục vào bộ sưu tập (mảng trong bài viết) và áp dụng thuộc tính [XmlElement("link")] cho bộ getter/setter.

Chúc mừng.

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