2008-10-02 27 views
9

Tôi đang sắp xếp một đối tượng trong ứng dụng C# VS2003/.Net 1.1. Tôi cần nó serialized mà không có hướng dẫn xử lý, tuy nhiên. Lớp XmlSerializer đặt ra một cái gì đó như thế này:Bỏ qua hướng dẫn xử lý XML khi tuần tự hóa một đối tượng

<?xml version="1.0" encoding="utf-16" ?> 
<MyObject> 
    <Property1>Data</Property1> 
    <Property2>More Data</Property2> 
</MyObject> 

Có cách nào để có được một cái gì đó như sau, mà không xử lý văn bản kết quả để loại bỏ các thẻ?

<MyObject> 
    <Property1>Data</Property1> 
    <Property2>More Data</Property2> 
</MyObject> 

Đối với những người tò mò, mã của tôi trông như thế này ...

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 

using (TextWriter stringWriter = new StringWriter(builder)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 

Trả lời

3

Liên kết sau sẽ đưa bạn đến bài đăng nơi người nào đó có phương pháp ngăn chặn hướng dẫn xử lý bằng cách sử dụng XmlWriter và vào trạng thái 'Yếu tố' thay vì trạng thái 'Bắt ​​đầu'. Điều này khiến cho lệnh xử lý không được ghi.

Suppress Processing Instruction

Nếu bạn vượt qua một XmlWriter để serializer, nó sẽ chỉ phát ra một hướng dẫn xử lý nếu trạng thái của XmlWriter là 'Bắt ​​đầu' (nghĩa là, đã không có bất cứ điều gì ghi vào nó chưa).

// Assume we have a type named 'MyType' and a variable of this type named 
'myObject' 
System.Text.StringBuilder output = new System.Text.StringBuilder(); 
System.IO.StringWriter internalWriter = new System.IO.StringWriter(output); 
System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter); 
System.Xml.Serialization.XmlSerializer serializer = new 
System.Xml.Serialization.XmlSerializer(typeof(MyType)); 


writer.WriteStartElement("MyContainingElement"); 
serializer.Serialize(writer, myObject); 
writer.WriteEndElement(); 

Trong trường hợp này, người viết sẽ trong tình trạng 'tố' (bên trong một phần tử) vì vậy không hướng dẫn xử lý sẽ được ghi. Một khi bạn hoàn thành việc viết XML , bạn có thể trích xuất văn bản từ luồng cơ bản và xử lý văn bản đó thành nội dung trái tim của bạn.

+1

Nhưng điều này vẫn đòi hỏi sau chế biến kết quả để loại bỏ sự bắt đầu và kết thúc MyContainingElement thẻ, không có? Mặc dù ít nhất chúng sẽ được biết, vì vậy tốt ... –

+1

Tôi đã chơi với điều này và thay thế WriteStartElement bằng WriteRaw ("") và loại bỏ WriteEndElement - sau đó tất cả những gì tôi cần làm để có được kết quả tốt là TrimStart() BOM tắt. Mát mẻ! –

7

Trong 2.0, bạn sẽ sử dụng XmLWriterSettings.OmitXmlDeclaration, và serialize một XmlWriter - tuy nhiên tôi không nghĩ rằng đây tồn tại trong 1,1; vì vậy không phải hoàn toàn là hữu ích - nhưng chỉ một điều nữa "xem xét nâng cấp" ... và vâng, tôi nhận ra rằng không phải lúc nào cũng có thể.

0

Nếu theo "hướng dẫn xử lý" bạn ngụ ý khai báo xml, thì bạn có thể tránh điều này bằng cách đặt thuộc tính OmitXmlDeclaration của XmlWriterSettings. Bạn sẽ cần phải tuần tự hóa bằng cách sử dụng một XmlWriter, để thực hiện điều này.

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 

using (XmlWriter stringWriter = new StringWriter(builder, settings)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 

Nhưng ah, điều này không trả lời câu hỏi của bạn cho 1,1. Vâng, để tham khảo cho người khác.

8

tôi đã thực hiện một sự điều chỉnh nhỏ

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 
using (XmlWriter stringWriter = XmlWriter.Create(builder, settings)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 
+0

Cảm ơn bạn đã đăng chỉnh sửa: o) – Andrew

0

này hoạt động trong .NET 1.1. (Nhưng bạn vẫn nên xem xét nâng cấp)

XmlSerializer s1= new XmlSerializer(typeof(MyClass)); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 


    MyClass c= new MyClass(); 
    c.PropertyFromDerivedClass= "Hallo"; 

    sw = new System.IO.StringWriter(); 
    s1.Serialize(new XTWND(sw), c, ns); 
    .... 

    /// XmlTextWriterFormattedNoDeclaration 
    /// helper class : eliminates the XML Documentation at the 
    /// start of a XML doc. 
    /// XTWFND = XmlTextWriterFormattedNoDeclaration 
    public class XTWFND : System.Xml.XmlTextWriter 
    { 
    public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; } 
    public override void WriteStartDocument() { } 
    } 
1

Điều gì về bỏ qua không gian tên?

thay vì sử dụng

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
       namespaces.Add("", ""); 

ví dụ:

<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> 
+1

http://stackoverflow.com/questions/625927/omitting-namespace-when-serializing-an-object – NetSide

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