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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top