2014-01-30 93 views
0

具有與所述代碼問題呈現表現:的XDocument,Xelement.Save不正確編碼

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;。我可以手動解析它,但這是不合適的。

注:befeore的是,我是直接簽署deserialisation xml和它工作得很好,所以爲什麼XDocument使用不同的編碼XmlSerializer/XmlDocument對象,我不能弄明白。

另外:我想我可以只使用XmlDocument對象來構建文件,但我很好奇什麼是錯的。

回答

2

您正在添加serializedLicence作爲string,所以它被視爲文本,而不是XML,這就是爲什麼它看起來像你的文件。

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

謝謝。我是xml的新手,我沒有想到,節點標記之間的字符串應該被解析。奇蹟般有效。 – Tarec

+1

@Tarec它必須被解析,因爲否則就不會得到適當的表示XML的'XElement' /'XAttribute'實例的結構。 – MarcinJuraszek