Как десериализовать содержимое XML в строку - PullRequest
0 голосов
/ 16 февраля 2011

Я использую XmlSerializer для десериализации файла конфигурации.Я хочу иметь возможность извлекать дочернее содержимое элемента Xml в строковое поле.Этот дочерний контент может быть сам xml.

Простой пример:

public class Configuration
{
    [XmlAttribute]
    public string MyAttribute { get; set; }

    [XmlText]
    public string Content { get; set; }
}

Я пытаюсь проанализировать следующее:

<Configuration MyAttribute="foo">
    <SomeOtherXml />
</Configuration>

Я хочу, чтобы свойство Contentустановить на "<SomeOtherXml />", но я не могу заставить это работать.Я не хочу инкапсулировать содержимое внутри CDATA или чего-то подобного.

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

Спасибо

1 Ответ

1 голос
/ 16 февраля 2011

Можно использовать XmlSerializer, но он требует ручного разбора, так что в конечном итоге это может не стоить.

Могут быть другие и более эффективные способы сделать это, но я нашел способ сделать этоэто сделано для того, чтобы ваш класс Configuration реализовывал интерфейс IXmlSerializable .

public class Configuration : IXmlSerializable
{
    [XmlAttribute]
    public string MyAttribute { get; set; }

    [XmlText]
    public string Content { get; set; }

    public void ReadXml(XmlReader reader)
    {
        if(reader.NodeType == XmlNodeType.Element &&
           string.Equals("Configuration", reader.Name, StringComparison.OrdinalIgnoreCase))
        {
            MyAttribute = reader["MyAttribute"];
        }

        if(reader.Read() &&
           reader.NodeType == XmlNodeType.Element &&
           string.Equals("SomeOtherXml", reader.Name, StringComparison.OrdinalIgnoreCase))
        {
            Content = reader.ReadOUterXml();  //Content = "<SomeOtherXml />"
        }
    }

    public void WriteXml(XmlWriter writer) { }
    public XmlSchema GetSchema() { }
}

Надеюсь, это поможет.

...