Значения декодирования, хранящиеся в XDocument - PullRequest
2 голосов
/ 15 августа 2011

Я создал объект XDocument, содержащий некоторые данные об исключениях, я хочу сохранить их в XML-файле, чтобы их можно было просмотреть при обнаружении ошибок:

XDocument xmlDoc = XDocument.Parse(myCustomObject.SerializeToXml());

Я использую Save()способ сохранить эти данные в файл:

xmlDoc.Save(@"C:\myFile.xml", SaveOptions.None);

Один из узлов - это выход, содержащий экранированные символы (< и >), например

<RootNode>
  <Name>My Object</Name>
  <DiagnosticInfo>
    &lt;DiagnosticInfo&gt;
      &lt;Processors&gt;
        &lt;String&gt;
          Something Something
        &lt;String&gt;
      &lt;/Processors&gt;
    &lt;/DiagnosticInfo&gt;
  </DiagnosticInfo>
</RootNode>

.попытался вызвать HttpUtility.DecodeHtml() на элементе «DiagnosticInfo», но он всегда выводится как экранированный, в любом случае?Нужно ли что-то делать с элементом DiagnosticInfo, чтобы запретить ему рассматривать его как строку?

Элемент DiagnosticInfo был бы наиболее полезным, поэтому я бы хотел, чтобы он выглядел правильно, когдаXML-файл открыт.

Редактировать В ответ на комментарий Джона Скита:

public string SerializeToXml()
{
    XmlSerializer s = new XmlSerializer(GetType());

    using (StringWriter w = new StringWriter())
    {
        s.Serialize(w, this);
        return w.ToString();
    }
}

1 Ответ

1 голос
/ 15 августа 2011

. Сериализация .Net использует отражение, чтобы решить, какие элементы XML генерировать.Они основаны на именах свойств (например, Name, DiagnosticInfo).

Вы упомянули, что DiagnosticInfo - это XElement.Это означает, что это не иерархия других объектов, а именно то, что вам нужно, а скорее анализатор элементов XML, который фактически хранит свой XML в виде строки.Когда вы сериализуете его, вы просто получаете одно значение контента в виде строки.

Вам нужно либо разобрать / десериализовать вашу «информацию» в более сложную структуру, которая на самом деле содержит свойства, такие как "Processors", или написатьXML вручную, используя XmlTextWriter и .WriteStartElement(), WriteEndElement() и т. д.

Записать его вручную, а не пытаться его сериализовать, довольно легко и я бы выбрал.Единственный необычный метод, который вам понадобится - это XmlTextWriter.WriteRaw , который будет выводить ваш необработанный XML в середине ваших других записей.

...