In .NET, come posso scrivere un documento XML UTF-16 su una stringa con una distinta base
-
06-07-2019 - |
Domanda
Sto creando un XmlDocument sul volare in .NET con un documento XML. Poi lo trasformo con Transform () metodo di un XslCompiledTransform .
Il metodo Transform () ha generato un'eccezione perché nel flusso è stato trovato un carattere non valido per la codifica. Quando copio / incollo la stringa con l'aiuto di TextVisualizer in Visual Studio in Altova XmlSpy , non trova un problema di codifica.
Ho provato ad aggiungere un'intestazione UTF-16 al documento per renderlo renderizzato come UTF-16 e chiamare Transform dal testo risultante ha portato a lamentarsi di una DBA. Di seguito è una versione semplificata del codice che ho usato.
XmlDocument document = new XmlDocument();
XmlDeclaration decl = document.CreateXmlDeclaration("1.0", "UTF-16", null);
document.AppendChild(decl);
XmlNode root = document.CreateNode(XmlNodeType.Element, "RootNode", "");
XmlNode nodeOne = document.CreateNode(XmlNodeType.Element, "FirstChild", null);
XmlNode nodeTwp = doc.CreateNode(XmlNodeType.Element, "Second Child", null);
root.AppendChild(nodeOne);
root.AppendChild(nodeTwo);
document.AppendChild(root);
Che di conseguenza scrivo su una stringa in questo modo:
StringBuilder sbXml = new StringBuilder();
using (XmlWriter wtr = XmlWriter.Create(sbXml))
{
xml.WriteTo(wtr);
// More code that calls sbXml.ToString());
}
Cosa devo fare per aggiungere la distinta componenti o per far sì che XslCompiledTransform.Transform non si preoccupi della distinta?
Soluzione
Non è necessario aggiungere manualmente la dichiarazione xml.
Questo codice aggiungerà la distinta base e la dichiarazione all'output.
XmlDocument document = new XmlDocument();
// XmlDeclaration decl = document.CreateXmlDeclaration("1.0", "UTF-16", null);
// document.AppendChild(decl);
XmlNode root = document.CreateNode(XmlNodeType.Element, "RootNode", "");
XmlNode nodeOne = document.CreateNode(XmlNodeType.Element, "FirstChild", null);
XmlNode nodeTwo = document.CreateNode(XmlNodeType.Element, "SecondChild", null);
root.AppendChild(nodeOne);
root.AppendChild(nodeTwo);
document.AppendChild(root);
using(MemoryStream ms = new MemoryStream())
{
StreamWriter sw = new StreamWriter(ms, Encoding.Unicode);
document.Save(sw);
Console.Write(System.Text.Encoding.Unicode.GetString(ms.ToArray()));
}
Se è necessario l'output come byte [], è possibile utilizzare l'output di ms.ToArray (). Altrimenti puoi usare la codifica System.Text.Encoding appropriata per tradurre il byte [] in una varietà di codifiche.