代码之家  ›  专栏  ›  技术社区  ›  Clinton Pierce

SQL表上的XML读取器返回无效的XML

  •  2
  • Clinton Pierce  · 技术社区  · 17 年前

    我有一个SQL表,它有一个varchar(8)列,其中偶尔有二进制数据。(0x01、0x02等)。(更改列的格式或内容不是选项。)

    select * 
     from mytable 
     where clientID = 431620
     for xml auto
    

    我得到了有用的结果。注意proc_计数是如何编码的:

    <mytable clientID="431620" recno="19014235" pdate="2008-03-04T00:00:00"
       proc_counts="&#x1;&#x1;&#x2;&#x1;" otherstuff="foobar" 
       date="2008-02-17T00:00:00"/>
    

    SqlCommand cmd = new SqlCommand("select * from testing xml auto", connection);
    using (XmlReader xrd = cmd.ExecuteXmlReader())
    {
        xrd.Read();
        while (xrd.ReadState != ReadState.EndOfFile)
        {
            string s = xrd.ReadOuterXml();
            records.Add(s);
        }
    }
    

    这引发了: XmlException未处理。“”,十六进制值0x01是无效字符 上面的XML,但是没有足够的Google fu来解释为什么我没有得到它。建议?


    要使用此类数据创建表,此Transact-SQL代码在SSMS中工作:

    create table testing
    (clientid int, proc_counts varchar(8));
    insert into testing values (1, 'normal');
    insert into testing values (2, char(65) + char(1) + char(65));
    select * from testing for xml auto;
    

    多默可能是对的,那是 Normalization 房地产 XmlTextReader 这给我带来了麻烦。问题是(正如你从评论中看到的),我发现从一个 (SqlCommand).ExecuteXmlReader() 规范化 财产 XmlTextReader

    所以我决定了一个变通办法。如果我只是使用 SqlDataReader

    StringBuilder sb = new StringBuilder();
    using(SqlDataReader dr = cmd.ExecuteReader())
    {
        while(rdr.Read())
            sb.Append((string)rdr[0]);
    }
    
    2 回复  |  直到 17 年前
        1
  •  4
  •   dommer    17 年前

    这与XmlTextReader.Normalization属性有关。当显式创建XmlTextReader时,此属性设置为false,因此将解码“无效”字符。隐式创建XmlTextReader时,规范化设置为true。

    此处讨论了该属性:

    http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.normalization.aspx

    如果您“手动”进行处理(即创建一个XmlTextReader),我认为您可以避免错误。

    更新:

    该框架最新版本中的更改意味着“XmlReaderSettings.CheckCharacters=false”可能是ASP.NET 2.0+中的一种方法。XmlReaderSettings对象可以传递给XmlReader.Create。

        2
  •  1
  •   Kees C. Bakker    12 年前

    select *  from mytable  where clientID = 431620 for xml auto, BINARY BASE64