2009-07-22 30 views
6

tôi có nhu cầu deserialization rất cụ thể, xem ví dụ dưới đây:Lớp .NET XmlSerializer có thể deserialize InnerXml thành chuỗi không?

nói rằng tôi có lớp học sau đây:

[Serializable]
public class Person {
public string Name { get; set; }
public string PersonXml { get; set; }
}

và sau XML

 
<Person> 
    <Name>John</Name> 
    <PersonXml><someXmlFragment>text</someXmlFragment></PersonXml> 
</Person> 

Những gì tôi muốn là lớp XmlSerializer để deserialize InnerXml của < phần tử PersonXml > vào thuộc tính PersonXml dưới dạng một chuỗi. Tôi tự hỏi nếu nó có thể được thực hiện.

LƯU Ý: Tôi biết tôi có thể mã hóa các nội dung của <PersonXml> thoát chars XML bất hợp pháp, nhưng tôi muốn rời khỏi XML bên trong con người thân thiện hơn (không chứa & lt; và các tổ chức khác mà sẽ chỉ cofuse cuối của tôi người dùng)

Trả lời

3

Bạn luôn có thể triển khai IXmlSerializable và thực hiện bất cứ điều gì bạn ưa thích thông qua XmlReader.

+0

Đúng vậy, tôi đã không xem xét con đường như vậy. Điều này chắc chắn sẽ giải quyết vấn đề của tôi, mặc dù tôi đã hy vọng cho một số giải pháp rẻ hơn :) Cảm ơn! –

+0

BTW, bạn không cần [Serializable] để tuần tự hóa XML. [XmlElemenht ("Name")] cũng có thể được bỏ qua, vì trong trường hợp này nó không thay đổi hành vi mặc định của XMLSerializer. –

1

Vì vậy, mặc dù phần tử thực sự chứa các phần tử XML, bạn muốn .NET giả vờ nó thực sự là một chuỗi? Tôi không nghĩ rằng điều này là có thể thông qua serialization tiêu chuẩn.

Tuy nhiên, bạn có thể tải XML, chuyển đổi PersonXml và thoát đúng nó và sau đó thay thế nội dung của PersonXml bằng dữ liệu mới được thoát. Nó sẽ liên quan đến việc thao tác thủ công XML trước khi deserializing nó, nhưng sau đó bạn có thể giữ các phần tử XML trong PersonXml.

+0

Yeah, nhưng điều này dường như với tôi như quá nhiều rắc rối và một giải pháp khá xấu xí :) –

0

Tại sao không sử dụng XML để biểu thị XML? Chỉ cần sử dụng XmlElement cho PersonXml.

Bạn nên giả vờ rằng XML cũng giống như Chuỗi.

0

Bài đăng cũ, nhưng khi tôi đang tìm kiếm giải pháp và có lẽ câu trả lời của tôi có thể giúp ai đó.

gì về

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

này sẽ không giải quyết vấn đề của bạn, nhưng có lẽ nó có thể là một sự thay thế chấp nhận được.

Trong trường hợp của tôi, PersonXml là một "yếu tố cần có" không phải lúc nào cũng chứa Xml. [XmlText] khiến cho PersonXml bị vô hiệu khi PersonXml chứa Xml. Tuy nhiên khi PersonXml chứa văn bản không có Xml thì việc deserialization là chính xác.

Trong trường hợp của tôi không có [XmlText], Xml trong PersonXml sẽ khiến các phần tử trước khi PersonXml được deserialized chính xác nhưng các phần tử sau khi PersonXml được deserialized không chính xác.

0

Tôi đã đặt câu hỏi này khi tìm kiếm giải pháp tương tự. Không muốn sử dụng IXmlSerializable.

Vì vậy, để tham khảo nếu có ai đang xem xét vấn đề này trong tương lai, bạn có thể sử dụng thuộc tính XmlAnyElement để tuần tự hóa xml bên trong xmlNode. Sau đó bạn có thể đăng quá trình XmlNode như bạn thấy phù hợp, chạy serialization riêng biệt hoặc chỉ nhận được văn bản của xml khi cần thiết.

Ví dụ này:

public class Person 
{ 

    public string Name { get; set; } 

    [XmlAnyElement] 
    public XmlNode PersonXml { get; set; } 

} 
+0

Cũng đáng giá thêm thuộc tính [XmlText] vào PersonXml. Điều này sẽ bao gồm và các nút văn bản là con của nút – user2346593

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