解码存储在XDocument中的值

时间:2011-08-15 10:42:04

标签: .net xml linq-to-xml

我创建了一个包含一些异常数据的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>

我尝试在“DiagnosticInfo”XElement上调用HttpUtility.DecodeHtml(),但它始终以转义方式输出,无论如何都是这样?我是否必须对DiagnosticInfo元素执行某些操作,以告诉它不要将其内容视为字符串?

DiagnosticInfo元素是最有用的元素,因此我希望在打开XML文件时让它看起来正确。

修改 回应Jon Skeet的评论:

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

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

1 个答案:

答案 0 :(得分:1)

.Net序列化使用反射来决定要生成哪些XML元素。这些基于属性名称(如NameDiagnosticInfo)。

你提到DiagnosticInfo是一个XElement。这意味着它不是其他对象的层次结构,这是您想要的,而是它是XML元素的解析器,并实际上将其XML存储为字符串。序列化时,只需将单个内容值作为字符串。

您需要将“信息”解析/反序列化为更复杂的结构,实际上包含"Processors"等属性,或者使用XmlTextWriter和{{1}手动编写XML },.WriteStartElement()

手动编写,而不是尝试序列化,非常简单,这将是我的选择。您需要的唯一不寻常的方法是XmlTextWriter.WriteRaw,它将在您的其他写入过程中流出您的原始XML。