我正在构建 XmlDocument 使用xml文档在.NET中运行。然后我用 Transform()<转换它/ a> XslCompiledTransform 的方法。

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?

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top