首页 > 解决方案 > 将 xmlfile 插入数据库时​​出错

问题描述

我正在尝试将我从流中读取的 xml 文件插入到 mssql 服务器中的 xml 类型的列中,如下所示:

//从流中读取文件

                    var reader = new StreamReader(request.InputStream, Encoding.UTF8);
                    var string = reader.ReadToEnd();

//转换成xmldoc

                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.LoadXml(string);

//尝试使用xmlDoc将它插入到表中

        using (SqlConnection con = new SqlConnection(_connectionString))
        {
            con.Open();
            using (SqlCommand cmd = new SqlCommand(
                @"INSERT INTO [XMLTable] (XmlData) VALUES(@XmlData);", con))
            {
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@XmlData", xmlDoc.InnerXml);

                cmd.ExecuteScalar();
             
            }
        }

//示例xml:

    <?xml version="1.0" encoding="utf-8"?>
<ChangeSSNR version="1.0" xmlns="http://schemas.testschema.com/ChangeSSNR/1.0/">
  <Header version="1.0">
    <From>someone</From>
    <To>someoneelse</To>
    <TimeStamp>1900-01-01T01:01:01+01:00</TimeStamp>
    <ppnSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
  </Header>
  <ChangeSSNRid id="4294967295">
    <SSNRChange>
      <NewSSNR>09834098098</NewSSNR>
      <OldSSNR>9879879827345</OldSSNR>
    </SSNRChange>
  </ChangeSSNRid>
  <ChangeSSNRid id="42949367295">
    <SSNRChange>
      <NewSSNR>098340980983</NewSSNR>
      <OldSSNR>98798798273453</OldSSNR>
    </SSNRChange>
  </ChangeSSNRid>
</ChangeSSNR>

获取异常:XML 解析:第 1 行,字符 38,无法切换编码

亲切的问候

/鲁迪

标签: c#sql-serverxmlxml-parsingsqlxml

解决方案


XML 文件的第一行不应有任何前导空格:

XML

<?xml version="1.0" encoding="utf-8"?>
<ChangeSSNR version="1.0" xmlns="http://schemas.testschema.com/ChangeSSNR/1.0/">
    <Header version="1.0">
        <From>someone</From>
        <To>someoneelse</To>
        <TimeStamp>1900-01-01T01:01:01+01:00</TimeStamp>
        <ppnSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:nil="true"/>
    </Header>
    <ChangeSSNRid id="4294967295">
        <SSNRChange>
            <NewSSNR>09834098098</NewSSNR>
            <OldSSNR>9879879827345</OldSSNR>
        </SSNRChange>
    </ChangeSSNRid>
    <ChangeSSNRid id="42949367295">
        <SSNRChange>
            <NewSSNR>098340980983</NewSSNR>
            <OldSSNR>98798798273453</OldSSNR>
        </SSNRChange>
    </ChangeSSNRid>
</ChangeSSNR>

处理 XML 时最好使用 LINQ to XML。自 2007 年以来,它在 .Net Framework 中可用。

C#

...
XDocument xdoc = XDocument.Parse(string);
...
cmd.Parameters.AddWithValue("@XmlData", xdoc.ToString());

推荐阅读