В .NET, как мне написать XMLDocument UTF-16 в строку с спецификацией - PullRequest
0 голосов
/ 31 июля 2009

Я создаю 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, чтобы не заботиться о бомбе?

1 Ответ

3 голосов
/ 31 июля 2009

Вам не нужно вручную добавлять объявление 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 для перевода байта [] во множество кодировок.

...