Em .NET, como faço para escrever uma XMLDocument UTF-16 para uma string com um BOM
-
06-07-2019 - |
Pergunta
Estou construindo um XmlDocument na voar em .NET com um documento XML. I então transformá-lo com o Transform () método de um XslCompiledTransform .
O método de transformação () lançou uma excepção porque um carácter inválido para a codificação foi encontrado na corrente. Quando eu copiar / colar a corda com a ajuda do TextVisualizer no Visual Studio em Altova XMLSpy , ele não encontra um problema de codificação.
Eu tentei adicionar um cabeçalho UTF-16 para o documento para torná-lo tornar como UTF-16 e chamado Transform no texto resultante levou a que reclamar de uma BOM. Abaixo está uma versão simplificada do código que eu usei.
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);
O que eu estou escrevendo, consequentemente, para uma string assim:
StringBuilder sbXml = new StringBuilder();
using (XmlWriter wtr = XmlWriter.Create(sbXml))
{
xml.WriteTo(wtr);
// More code that calls sbXml.ToString());
}
O que devo fazer para adicionar o BOM ou get XslCompiledTransform.Transform não se preocupam com o bom?
Solução
Você não precisa adicionar manualmente a declaração XML.
Este código irá adicionar o BOM ea declaração para a saída.
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 você precisar a saída como um byte [], você pode usar a saída do ms.ToArray (). Caso contrário, você pode usar a codificação System.Text.Encoding adequada para traduzir o byte [] em uma variedade de codificações.