我创建了一个包含一些异常数据的XDocument对象,我想将其保存到XML文件中,以便在调查错误时对其进行检查:
XDocument xmlDoc = XDocument.Parse(myCustomObject.SerializeToXml());
我使用Save()
方法将此数据保存到文件:
xmlDoc.Save(@"C:\myFile.xml", SaveOptions.None);
其中一个节点的输出包含转义字符(<
和>
),例如
<RootNode>
<Name>My Object</Name>
<DiagnosticInfo>
<DiagnosticInfo>
<Processors>
<String>
Something Something
<String>
</Processors>
</DiagnosticInfo>
</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();
}
}
答案 0 :(得分:1)
.Net序列化使用反射来决定要生成哪些XML元素。这些基于属性名称(如Name
,DiagnosticInfo
)。
你提到DiagnosticInfo是一个XElement。这意味着它不是其他对象的层次结构,这是您想要的,而是它是XML元素的解析器,并实际上将其XML存储为字符串。序列化时,只需将单个内容值作为字符串。
您需要将“信息”解析/反序列化为更复杂的结构,实际上包含"Processors"
等属性,或者使用XmlTextWriter和{{1}手动编写XML },.WriteStartElement()
等
手动编写,而不是尝试序列化,非常简单,这将是我的选择。您需要的唯一不寻常的方法是XmlTextWriter.WriteRaw,它将在您的其他写入过程中流出您的原始XML。