首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL表上的XML读取器返回无效的XML

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

Stack Overflow用户
提问于 2009-03-23 18:20:57
回答 2查看 5.6K关注 0票数 2

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

当我进入SQLServer2005ManagementStudio并运行查询时:

代码语言:javascript
复制
select * 
 from mytable 
 where clientID = 431620
 for xml auto

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

代码语言:javascript
复制
<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"/>

完全有效的XML,AFAIK。现在,当我实际编写C#代码来读取这一行时,会在ReadOuterXml期间抛出异常:

代码语言:javascript
复制
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中工作:

代码语言:javascript
复制
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;

更新:死后和解决问题

Dommer可能是对的,是XmlTextReader中的XmlTextReader属性给我带来了问题。问题是(正如您可以从评论中看到的),我发现几乎不可能从(SqlCommand).ExecuteXmlReader()到任何允许我接近XmlTextReaderNormalization属性的东西。关于这一点的Microsoft文档常常是矛盾的,或者是完全错误的。

所以我决定找个解决办法。如果我只是使用一个SqlDataReader来吸收输出,那么一切都很好。XML看起来很完美,并且分析得很好。

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
    while(rdr.Read())
        sb.Append((string)rdr[0]);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-23 19:07:48

这与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。

票数 5
EN

Stack Overflow用户

发布于 2009-03-23 18:46:11

例外是告诉你真相。Server显然允许显示无效的XML。试试这个:

代码语言:javascript
复制
select *  from mytable  where clientID = 431620 for xml auto, BINARY BASE64
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/674603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档