Tôi có một số tệp XML với các phần tử gốc khác nhau, nhưng cùng loại phần tử con và tôi muốn có thể tạo một lớp duy nhất để giữ các phần tử gốc khác nhau để giữ mỗi phần tử con. Dưới đây là hai ví dụ về cách các tệp XML trông như thế nào.(De) tuần tự hóa các tên phần tử gốc khác nhau sử dụng một lớp
Tập 1:
<?xml version="1.0" encoding="utf-8" ?>
<Sandra>
<Address>
<Street></Street>
<Number></Number>
</Address>
</Sandra>
Tập 2:
<?xml version="1.0" encoding="utf-8" ?>
<John>
<Address>
<Street></Street>
<Number></Number>
</Address>
</John>
Tôi muốn để có thể cả serialize và deserialize này chỉ sử dụng 2 lớp, như:
[Serializable]
[XmlRoot]
public class Person
{
[XmlElement("Address")]
public List<Address> Adresses { get; set; }
}
[Serializable]
public class Address
{
public string Street { get; set; }
public string Number { get; set; }
}
tôi cố đọc chúng bằng cách sử dụng:
var ser = new XmlSerializer(typeof(Person));
var reader = XmlReader.Create("person1.xml");
var person = (Person)ser.Deserialize(reader);
Nhưng tôi nhận được "There is an error in XML document (2, 2)."
, bởi vì bộ khử mùi được mong đợi là một phần tử gốc <"Person">
và không phải là <"John">
hoặc <"Paul">
. Nó hoạt động tốt nếu tôi thay đổi [XmlRoot]
thành [XmlRoot("John")]
nhưng đó là chính xác những gì tôi đang cố gắng tránh ở đây.
Ngoài ra, tôi phải có khả năng tuần tự hóa lại bằng cách sử dụng cùng cấu trúc XML lạ, vì vậy tôi cần lưu trữ tên phần tử gốc bên trong lớp Person.
Tôi biết tôi chỉ đơn giản có thể tạo bộ nối tiếp (de) của riêng mình nhưng tôi muốn biết liệu có thể đạt được nó bằng các phương pháp hiện có hay không.
Chỉnh sửa 1: (cuộn lại).
Chỉnh sửa 2: cuộn lại các sửa đổi "Chỉnh sửa 1" vì tôi đã tìm thấy cách đơn giản hơn để đạt được những gì tôi cần. Xem câu trả lời của tôi dưới đây.
Yeah, nó kinda lạ, quả thật vậy. Nhưng không phải để tôi thay đổi cấu trúc XML, tôi chỉ phải đọc và viết tôn trọng định dạng này. –