Làm thế nào để tuần tự hóa một đối tượng có thể tuần tự hóa XML thành một đoạn XML (không có khai báo XML hay tham chiếu không gian tên trong phần tử gốc)?Nối tiếp thành một đoạn XML - không phải tài liệu XML
Trả lời
Dưới đây là một cách hack-ish để làm điều đó mà không cần phải tải toàn bộ chuỗi đầu ra vào một XmlDocument:
using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public class Example
{
public String Name { get; set; }
static void Main()
{
Example example = new Example { Name = "Foo" };
XmlSerializer serializer = new XmlSerializer(typeof(Example));
XmlSerializerNamespaces emptyNamespace = new XmlSerializerNamespaces();
emptyNamespace.Add(String.Empty, String.Empty);
StringBuilder output = new StringBuilder();
XmlWriter writer = XmlWriter.Create(output,
new XmlWriterSettings { OmitXmlDeclaration = true });
serializer.Serialize(writer, example, emptyNamespace);
Console.WriteLine(output.ToString());
}
}
Bạn sẽ có thể chỉ serialize như bạn thường làm, và sau đó sử dụng Root
tài sản từ các tài liệu kết quả.
Bạn có thể cần xóa các thuộc tính của phần tử trước.
+1 Âm thanh tốt với tôi nhưng những gì tôi không giải thích được trong câu hỏi của tôi là tôi muốn tạo luồng chứ không phải XmlDocument. – Emmanuel
Bằng cách này là tuyệt vời. Tôi đã triển khai mã này để dễ dàng làm việc với các mảnh xml như các lớp nhanh chóng và sau đó bạn chỉ có thể thay thế nút khi hoàn tất. Điều này làm cho quá trình chuyển đổi giữa mã và xml cực kỳ dễ dàng.
Trước tiên hãy tạo một số phương pháp tiện ích.
public static class SerializableFragmentExtensions
{
public static XElement ToElement(this ISerializableFragment iSerializableFragment)
{
var serializer = new XmlSerializer(iSerializableFragment.GetType());
var emptyNamespace = new XmlSerializerNamespaces();
emptyNamespace.Add(String.Empty, String.Empty);
var output = new StringBuilder();
var writer = XmlWriter.Create(output,
new XmlWriterSettings { OmitXmlDeclaration = true });
serializer.Serialize(writer, iSerializableFragment, emptyNamespace);
return XElement.Parse(output.ToString(), LoadOptions.None);
}
public static T ToObject<T>(this XElement xElement)
{
var serializer = new XmlSerializer(typeof (T));
var reader = xElement.CreateReader();
var obj = (T) serializer.Deserialize(reader);
return obj;
}
}
Tiếp Thực hiện giao diện yêu cầu (giao diện marker - Tôi biết bạn đang không được phép nhưng tôi nghĩ rằng đây là lý do hoàn hảo để nó.)
public interface ISerializableFragment
{
}
Bây giờ tất cả các bạn phải làm là trang trí bất kỳ lớp Serializable nào, bạn muốn chuyển đổi thành một phân đoạn XElement, với giao diện.
[Serializable]
public class SomeSerializableClass : ISerializableFragment
{
[XmlAttribute]
public string SomeData { get; set; }
}
Cuối cùng kiểm tra mã.
static void Main(string[] args)
{
var someSerializableClassObj = new SomeSerializableClass() {SomeData = "Testing"};
var element = someSerializableClass.ToElement();
var backToSomeSerializableClassObj = element.ToObject<SomeSerializableClass>();
}
Cảm ơn bạn lần nữa vì mã hữu ích đáng kinh ngạc này.
Có vấn đề tôi đã ngay lập tức khi thực hiện việc này trong dự án của riêng tôi. Với đoạn văn bản chính xác theo đúng tên, như trong ví dụ tôi đã cung cấp, mã hoạt động hoàn hảo. Tôi đã có một tên lớp không có cùng tên với phần tử gốc. Câu trả lời đơn giản là thêm XmlRootAttribute vào lớp và đặt tên nó giống như tên của phần tử gốc trong xml. Điều này làm việc mà không có lỗ hổng. Bạn cũng có thể yên tâm rằng bất kỳ phần tử nào tồn tại trong xmldocument không được thể hiện trong định nghĩa lớp sẽ không phá vỡ phân tích cú pháp. – jwize
- 1. Nối tiếp XML chậm
- 2. Nối tài liệu xml vào nút xml trong C#?
- 3. XML IDREF một tài liệu XML khác?
- 4. Nối tiếp một đối tượng thành JSON, XML, YAML?
- 5. XML: để nối thêm tài liệu xml vào nút của tài liệu khác
- 6. Nối tiếp một bitmap trong C# /. NET thành XML
- 7. Hợp nhất hai đoạn xml thành một?
- 8. Nối tiếp thành XML qua DataContract: đầu ra tùy chỉnh?
- 9. Nối tiếp XML trong C#
- 10. Nối tiếp danh sách cặp khóa/giá trị thành XML
- 11. Hợp nhất nhiều tài liệu từ thành một Mở Xml
- 12. Nối tiếp thành XML bằng cách sử dụng boost :: serialization
- 13. Xây dựng không thành công do lỗi tài liệu xml
- 14. Nối tiếp XML VS Phân tích cú pháp XML
- 15. Có tài liệu XML Android nào không?
- 16. Nối tiếp XML cùng một thẻ hai lần
- 17. API Web - Nối tiếp động với XML
- 18. Tài liệu XML cho không gian tên
- 19. I18N của tài liệu XML
- 20. Generics trong vấn đề tài liệu XML
- 21. Nhúng tài liệu xml vào bên trong chuỗi xml
- 22. Phát hành de-serializing XML thành Object - Có lỗi trong tài liệu XML (0, 0)
- 23. Nối tiếp và Lược đồ XML không có xsd.exe
- 24. Deserialization lỗi trong tài liệu XML (1,1)
- 25. Trình thông tin XML là gì và theo cách nào khác với một tài liệu XML?
- 26. LINQ to XML - Tải các đoạn XML từ tệp
- 27. Việc hợp nhất các tài liệu xml
- 28. XSLT: Biến đổi thành nội dung không phải là xml?
- 29. lxml Tạo đoạn XML không có phần tử gốc?
- 30. Nối tiếp chuỗi XML của DateTime và xsd: date?
+1 - Tôi không nghĩ rằng nó thực sự là hackish cả. Có thể thiết lập công việc nhiều hơn tôi muốn làm. Nhưng, cuối cùng, nó nói với nó định dạng đầu ra nên được trước khi nó thực hiện công việc. Đó không phải là một hack. Một hack sẽ là để loại bỏ tất cả mọi thứ ra sau khi thực tế, vv –
Tôi đồng ý với Andrew rằng đây là hackish. Trừ khi tôi đang làm điều gì đó sai, tất cả các yếu tố của tôi có thuộc tính 'xmlns = ""'. Đã có thể ưa thích rằng điều này không có mặt chút nào. –
** không có thao tác XmlDocument/XmlNode ** – Kiquenet