【问题标题】:Convert utf-8 XML document to utf-16 for inserting into SQL将 utf-8 XML 文档转换为 utf-16 以插入 SQL
【发布时间】:2012-06-05 01:23:54
【问题描述】:

我有一个使用 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 数据绝对是有效的,并且包含了我需要的所有信息。

更新: 初始 XML 是通过使用 XMLSerializer(带有 Utf8StringWriter 类)从现有对象模型(engine)创建 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 查看器出错。

【问题讨论】:

    标签: c# xml encoding


    【解决方案1】:

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

    【讨论】:

    • 感谢您的评论。实际上,我首先从另一个使用 XMLSerializer 创建 XML 的方法中获得了字符串,因此我无法访问流本身。
    • 所以看看第一个字符 - 可能有“encoding=....”,如果它存在或设置为不同的 UTF-16 是你的问题。在这种情况下,我会尝试使用 XmlDocument.LoadXml ...
    【解决方案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();
    

    【讨论】:

    • 我刚刚注意到我在示例中指定了错误的字符串编写器。我的意思是只使用 StringWriter,因为我想要 utf-16 中的 XML 而不是 utf-8。更新了我的问题。
    • @dreza 这一行 "xDoc.Declaration.Encoding = "utf-16";"那么应该为你做trcik :)
    【解决方案3】:

    这是我必须做的才能让它发挥作用。这只是将 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();    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 2015-09-21
      • 2013-04-11
      • 2010-10-19
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多