2009-07-30 12 views
0

Je construis un XmlDocument à la volée dans .NET avec un document xml. Je transforme ensuite cela avec la méthode Transform() d'un XslCompiledTransform.Dans .NET, comment écrire un XMLDocument UTF-16 dans une chaîne avec une nomenclature

La méthode Transform() a émis une exception car un caractère non valide pour le codage a été trouvé dans le flux. Lorsque je copier/coller la chaîne à l'aide de TextVisualizer dans Visual Studio dans Altova XmlSpy, il ne trouve pas un problème d'encodage.

J'ai essayé d'ajouter un en-tête UTF-16 au document pour le rendre en UTF-16 et en appelant Transform à partir du texte résultant conduit à se plaindre d'une nomenclature. Voici une version simplifiée du code que j'ai utilisé.

  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); 

Ce que je vous écris par conséquent à une chaîne comme ceci:

 StringBuilder sbXml = new StringBuilder(); 
     using (XmlWriter wtr = XmlWriter.Create(sbXml)) 
     { 
      xml.WriteTo(wtr); 
      // More code that calls sbXml.ToString()); 
     } 

Que dois-je faire pour ajouter à fichait BOM ou se XslCompiledTransform.Transform sur le bom?

Répondre

3

Vous n'avez pas besoin d'ajouter manuellement la déclaration XML.

Ce code ajoutera la nomenclature et la déclaration à la sortie.

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())); 
} 

Si vous avez besoin de la sortie comme un octet [], vous pouvez utiliser la sortie de ms.ToArray(). Sinon, vous pouvez utiliser l'encodage System.Text.Encoding approprié pour traduire l'octet [] en une variété de codages.