gpt4 book ai didi

c# - SQL 表上的 XML 阅读器返回无效的 XML

转载 作者:数据小太阳 更新时间:2023-10-29 02:59:53 26 4
gpt4 key购买 nike

我的 SQL 表有一个 varchar(8) 列,偶尔会有二进制数据。 (0x01、0x02 等...)。 (不能更改列的格式或内容。)

当我进入 SQL Server 2005 Management Studio 并运行查询时:

select * 
from mytable
where clientID = 431620
for xml auto

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

<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 期间抛出异常:

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;

更新:事后分析和解决方法

Dommer 可能是对的,是 XmlTextReader 中的 Normalization 属性给我带来了问题。问题是(正如您从评论中看到的那样)我发现几乎不可能从 (SqlCommand).ExecuteXmlReader() 到任何能让我接近 Normalization< 的东西 XmlTextReader 的属性。 Microsoft 关于此的文档通常是自相矛盾的或完全错误的。

所以我想出了一个解决方法。如果我只是使用 SqlDataReader 来吸收输出,一切都很好。 XML 看起来很完美并且解析得很好。

StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
while(rdr.Read())
sb.Append((string)rdr[0]);
}

最佳答案

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

关于c# - SQL 表上的 XML 阅读器返回无效的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/674603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com