【问题标题】:Xdocument, Xelement.Save incorrect encodingXdocument, Xelement.Save 编码不正确
【发布时间】:2014-01-30 14:55:26
【问题描述】:

我遇到的代码有问题:

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 对象中的文本在创建之后就持有&amp;lt;&amp;gt;。我可以手动解析它,但这是不合适的。

注意:在此之前,我直接签署了反序列化 xml,它运行良好,所以我不明白为什么 XDocument 使用与 XmlSerializer/XmlDocument 对象不同的编码。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我是 xml 新手,我没想到节点标记之间的字符串应该被解析。像魅力一样工作。
    • @Tarec 必须对其进行解析,否则您将无法获得代表 XML 的 XElement/XAttribute 实例的正确结构。
    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多