【问题标题】:Decoding values stored in XDocument解码存储在 XDocument 中的值
【发布时间】:2011-08-15 10:42:03
【问题描述】:

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

【问题讨论】:

  • 听起来问题出在myCustomObject.SerializeToXml,您没有显示。
  • @Jon Skeet - 更新问题。想一想,DiagnosticInfo 是作为字符串存储在对象中的,会不会是这个问题?
  • 是的,当然。基本上,您显示的 XML 将是 SerializeToXml 的结果,我强烈怀疑...

标签: .net xml linq-to-xml


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2014-09-16
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多