2009-07-30 72 views
0

我使用xml文档在.NET中快速构建XmlDocument。然后我用Transform()方法XslCompiledTransform转换它。在.NET中,如何使用BOM编写UTF-16 XMLDocument字符串

Transform()方法抛出异常,因为在流中找到了编码的无效字符。当我借助Visual Studio中的TextVisualizer将字符串复制/粘贴到Altova XmlSpy中时,它找不到编码问题。

我试着在文档中添加一个UTF-16头文件,使其呈现为UTF-16格式,并从导致它产生的文本中调用Transform来抱怨BOM。以下是我使用的代码的简化版本。

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

我应该做些什么来添加BOM或获得XslCompiledTransform.Transform不关心BOM?

回答

3

您不需要手动添加xml声明。

该代码将BOM和声明添加到输出。

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

如果您需要输出为byte [],则可以使用ms.ToArray()的输出。否则,您可以使用适当的System.Text.Encoding编码将byte []转换为各种编码。