В .NET, как мне написать XMLDocument UTF-16 в строку с спецификацией
-
06-07-2019 - |
Вопрос
Я создаю XmlDocument на летать в .NET с документом XML. Затем я преобразую это с помощью Transform () метод XslCompiledTransform . р>
Метод Transform () вызвал исключение, поскольку в потоке был обнаружен недопустимый символ для кодировки. Когда я копирую / вставляю строку с помощью TextVisualizer в Visual Studio в Altova XmlSpy , он не находит проблемы с кодировкой.
Я попытался добавить заголовок UTF-16 в документ, чтобы он отображался как UTF-16, и вызов Transform из полученного текста привел к жалобе на спецификацию. Ниже приведена упрощенная версия кода, который я использовал.
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);
который я, следовательно, записываю в строку примерно так:
StringBuilder sbXml = new StringBuilder();
using (XmlWriter wtr = XmlWriter.Create(sbXml))
{
xml.WriteTo(wtr);
// More code that calls sbXml.ToString());
}
Что я должен сделать, чтобы добавить спецификацию или получить XslCompiledTransform.Transform, чтобы не заботиться о бомбе?
Решение
Вам не нужно вручную добавлять объявление xml.
Этот код добавит спецификацию и объявление к выводу.
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()));
}
Если вам нужен вывод в виде байта [], вы можете использовать вывод из ms.ToArray (). В противном случае вы можете использовать соответствующую кодировку System.Text.Encoding для перевода байта [] во множество кодировок. Р>