Xdocument,Xelement.Save不正确的编码

时间:2014-01-30 14:55:27

标签: c# xml xml-serialization xml-signature

我遇到的代码有问题:

string serializedLicence = SerializationHelper.ToXML(licenceInfo);
var licenceFileXml = new XElement("Licence", new XElement("LicenceData", serializedLicence)));
XmlDocument signedLicence = SignXml(licenceFileXml.ToString(), Properties.Resources.PRIVATE_KEY);
signedLicence.Save(saveFileDialogXmlLicence.FileName);

创建的文件具有错误的字符串编码,发送到XElement构造函数以及签名,使用自定义SignXml()方法分配(使用XmlDocument.DocumentElement.AppendChild()方法创建签名,但现在这无关紧要)。输出:

<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<Licence>
    <LicenceData>&lt;?xml version="1.0" encoding="utf-16"?&gt;
    &lt;LicenceInfo
    //stuff stuff stuff
    &lt;/LicenceInfo&gt;</LicenceData>
    <Signature>&lt;SignedInfo xmlns="h stuff stuff stuff</Signature>
</Licence>

所以基本上我正在使用序列化的对象字符串并将它放在标记之间,这部分编码错误。调试器向我显示,XElement对象中的文本在创建后立即保持&lt;&gt;。我可以手动解析它,但那是不合适的。

注意:请注意,我直接签署了反序列化xml并且工作正常,所以我无法弄清楚为什么XDocument使用不同于XmlSerializer / XmlDocument对象的编码

另外:我想我可以使用XmlDocument对象来构建文件,但我很好奇有什么不对。

1 个答案:

答案 0 :(得分:2)

您将serializedLicence添加为string,因此将其视为文本,而不是XML,这就是您在文档中看起来像这样的原因。

var licenceFileXml = new XElement("Licence",
                         new XElement("LicenceData",
                             XDocument.Parse(serializedLicence).Root)));