Как использовать XmlSerializer для вставки строки XML - PullRequest
9 голосов
/ 30 июня 2009

Я определил следующий класс:

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

и создал объект:

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

Когда я использую класс XmlSerializer для сериализации этого объекта, он вернет xml:

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

Как мне сделать так, чтобы он не кодировал содержимое моего XmlString, чтобы я мог получить сериализованный XML как

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

Спасибо, Ian

Ответы [ 4 ]

13 голосов
/ 30 июня 2009

Вы можете ограничить пользовательскую сериализацию только тем элементом, который требует особого внимания, например так.

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);
    }
}
2 голосов
/ 30 июня 2009

Вы можете (ab) использовать для этого IXmlSerializable интерфейс и XmlWriter.WriteRaw . Но, как отметил Гаретм, вам придется написать собственный код сериализации.

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;
    }
  }
}

печать

<?xml version="1.0" encoding="ibm850"?>
<Root>
  <Name>Test</Name>
  <XmlString><Foo>bar</Foo></XmlString>
</Root>
1 голос
/ 30 июня 2009

попробуйте это:

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

Root t = new Root 
         {  Name = "Test", 
            XmlString = XDocument.Parse("<Foo>bar</Foo>")
         };
0 голосов
/ 30 июня 2009

Я был бы очень удивлен, если бы это было возможно. Предположим, у вас есть возможность сделать это - что произойдет, если вы укажете XML в свойстве - все просто сломается.

Я ожидаю, что вам потребуется написать собственную сериализацию для этого случая или сделать так, чтобы поле XmlString представляло собой структуру, содержащую поле foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...