【问题标题】:In .NET, how do I write a UTF-16 XMLDocument to a string with a BOM在 .NET 中,如何将 UTF-16 XMLDocument 写入带有 BOM 的字符串
【发布时间】:2010-11-15 15:11:33
【问题描述】:

我正在.NET 中使用 xml 文档即时构建XmlDocument。然后我使用XslCompiledTransformTransform() 方法对其进行转换。

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?

【问题讨论】:

    标签: .net xml xmldocument byte-order-mark xslcompiledtransform


    【解决方案1】:

    您无需手动添加 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[] 转换为各种编码。

    【讨论】:

      猜你喜欢
      • 2017-07-15
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 2013-08-17
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多