将utf-8 XML文档转换为utf-16以插入SQL

时间:2012-06-05 01:23:55

标签: c# xml encoding

我有一个使用utf-8编码创建的XML文档。我想将该文档存储在sql 2008 xml列中,但我知道我需要将其转换为utf-16才能执行此操作。

我已尝试使用XDocument执行此操作,但转换后我没有获得有效的XML结果。这是我尝试进行转换的(Utf8StringWriter是一个继承自StringWriter并重载编码的小类):

XDocument xDoc = XDocument.Parse(utf8Xml);
StringWriter writer = new StringWriter();
XmlWriter xml = XmlWriter.Create(writer, new XmlWriterSettings() 
                { Encoding = writer.Encoding, Indent = true });

xDoc.WriteTo(xml);

string utf16Xml = writer.ToString();

utf16Xml中的数据无效,当尝试插入数据库时​​,我收到错误:

{"XML parsing: line 1, character 38, unable to switch the encoding"}

然而,最初的utf8Xml数据绝对有效并包含我需要的所有信息。

更新: 通过使用XMLSerializer(带有Utf8StringWriter类)从现有对象模型( engine )创建xml字符串来获取初始XML。代码是:

public static void Serialise<T>(T engine, ref StringWriter writer)
{
    XmlWriter xml = XmlWriter.Create(writer, new XmlWriterSettings() { Encoding = writer.Encoding });

    XmlSerializer xs = new XmlSerializer(engine.GetType());

    xs.Serialize(xml, engine);
}

我必须这样离开,因为代码不受我的控制而无法改变。

在我将utf16Xml字符串发送到失败的数据库调用之前,我可以通过Visual Studio调试器查看它,我注意到整个字符串不存在,而是我得到字符串文字没有关闭 XML查看器上的错误。

3 个答案:

答案 0 :(得分:2)

从utf8xml解析文档后,将文档编码设置为UTF-16

XDocument xDoc = XDocument.Parse(utf8Xml);
xDoc.Declaration.Encoding = "utf-16";
StringWriter writer = new StringWriter();
XmlWriter xml = XmlWriter.Create(writer, new XmlWriterSettings() 
                { Encoding = writer.Encoding, Indent = true });

xDoc.WriteTo(xml);

string utf16Xml = writer.ToString();

答案 1 :(得分:2)

错误发生在第一行XDocument xDoc = XDocument.Parse(utf8Xml);。很可能你将utf8流转换为字符串(utf8xml),但字符串中指定的编码仍然是utf-8,因此XML阅读器失败。如果确实比使用Load直接从流加载XML而不是首先将其转换为字符串。

答案 2 :(得分:0)

这就是我要做的工作。这只是将XML转换为utf-16

string getUtf16Xml(System.Xml.XmlDocument xmlDoc)
{    
   System.Xml.Linq.XDocument xDoc = System.Xml.Linq.XDocument.Parse(xmlDoc.OuterXml);
   xDoc.Declaration.Encoding = "utf-16";

   return xDoc.ToString();    
}

然后我可以将结果保存到数据库中。