2010-05-04 27 views

Trả lời

19

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()); 
    } 
} 
+0

+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 –

+1

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. –

+0

** không có thao tác XmlDocument/XmlNode ** – Kiquenet

-2
+2

No. Điều này sẽ tạo ra một tài liệu xml hợp lệ bao gồm các tham chiếu khai báo và không gian tên XML. Tôi chỉ muốn một mảnh. – Emmanuel

+0

IMHO, hãy xóa câu trả lời vì không hợp lệ cho câu hỏi. http://stackoverflow.com/help/how-to-answer – Kiquenet

1

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

+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

0

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.

+1

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

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