2009-06-29 24 views
9

tôi đã xác định các lớp sau đây:Làm thế nào để sử dụng XmlSerializer để chèn một chuỗi xml

public class Root 
{ 
    public string Name; 
    public string XmlString; 
} 

và tạo ra một đối tượng:

Root t = new Root 
     { Name = "Test", 
      XmlString = "<Foo>bar</Foo>" 
     }; 

Khi tôi sử dụng lớp XmlSerializer để tuần tự hóa đối tượng này, nó sẽ trả lại xml:

<Root> 
    <Name>Test</Name> 
    <XmlString>&lt;Foo&gt;bar&lt;/Foo&gt;</XmlString> 
</Root> 

Làm cách nào để làm cho nó không mã hóa nội dung XmlString của tôi để tôi có thể nhận xml được tuần tự hóa

<XmlString><Foo>bar</Foo></XmlString> 

Cảm ơn, Ian

Trả lời

1

tôi sẽ rất ngạc nhiên nếu điều này là có thể. Giả sử bạn có thể làm điều này - điều gì sẽ xảy ra nếu bạn có XML không đúng định dạng trong thuộc tính - mọi thứ sẽ chỉ vỡ.

Tôi hy vọng rằng bạn sẽ cần phải viết serialization của riêng bạn cho trường hợp này, hoặc làm cho nó để trường XmlString là một cấu trúc có chứa một trường foo.

2

Bạn có thể (ab) sử dụng IXmlSerializable interface an XmlWriter.WriteRaw cho điều đó. Nhưng như garethm chỉ ra bạn sau đó khá nhiều phải viết mã serialization của riêng bạn.

using System; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace ConsoleApplicationCSharp 
{ 
    public class Root : IXmlSerializable 
    { 
    public string Name; 
    public string XmlString; 

    public Root() { } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("Name", Name); 
     writer.WriteStartElement("XmlString"); 
     writer.WriteRaw(XmlString); 
     writer.WriteFullEndElement(); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) { /* ... */ } 
    public XmlSchema GetSchema() { return (null); } 
    public static void Main(string[] args) 
    { 
     Root t = new Root 
     { 
     Name = "Test", 
     XmlString = "<Foo>bar</Foo>" 
     }; 
     System.Xml.Serialization.XmlSerializer x = new XmlSerializer(typeof(Root)); 
     x.Serialize(Console.Out, t); 
     return; 
    } 
    } 
} 

in

<?xml version="1.0" encoding="ibm850"?> 
<Root> 
    <Name>Test</Name> 
    <XmlString><Foo>bar</Foo></XmlString> 
</Root> 
+0

Có phải deserialize quá không? – configurator

+0

Nếu bạn thực hiện phương pháp ReadXml (Trình đọc XmlReader), có. – VolkerK

1

thử điều này:

public class Root 
{ 
    public string Name; 
    public XDocument XmlString; 
} 

Root t = new Root 
     { Name = "Test", 
      XmlString = XDocument.Parse("<Foo>bar</Foo>") 
     }; 
13

Bạn có thể giới hạn serialization tùy chỉnh để chỉ là yếu tố cần quan tâm đặc biệt như vậy.

public class Root 
{ 
    public string Name; 

    [XmlIgnore] 
    public string XmlString 
    { 
     get 
     { 
      if (SerializedXmlString == null) 
       return ""; 
      return SerializedXmlString.Value; 
     } 
     set 
     { 
      if (SerializedXmlString == null) 
       SerializedXmlString = new RawString(); 
      SerializedXmlString.Value = value; 
     } 
    } 

    [XmlElement("XmlString")] 
    [Browsable(false)] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    public RawString SerializedXmlString; 
} 

public class RawString : IXmlSerializable 
{ 
    public string Value { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     this.Value = reader.ReadInnerXml(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteRaw(this.Value); 
    } 
} 
+0

+1, tôi thích điều này hơn lớp gốc của tôi: Cách tiếp cận IXmlSerializable. – VolkerK

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