【问题标题】:The quest for 0x0B寻找0x0B
【发布时间】:2009-11-16 19:31:48
【问题描述】:

从 SQL 列读取一些数据然后将其转换为 XML 时出现此错误:

“System.InvalidOperationException: XML 文档 (182, 16) 中有错误。---> System.Xml.XmlException: ' ', 十六进制值 0x0B, 是无效字符。”

很公平,也许数据格式不正确。除了,我怎样才能找到罪魁祸首行?

SELECT * from Mytable where Column like '%' + char(0x0B)+'%' 

返回空。

(显然我尝试了所有 %+char 、 char 、 char+% 组合,以防万一)

【问题讨论】:

    标签: sql-server-2005 debugging xml-serialization


    【解决方案1】:

    终于找到了!

    .NET XML 序列化程序在序列化无效字符时对其进行了转义,但随后 反序列化之前将其取消转义。

    所以我不得不搜索 escaped 来找到未转义的 0x0B ... 真的不好笑!

    所以这个:

      SELECT * from Mytable where Column like '%' + '&#xB' + '%'
    

    实际上会找到这个:

    <?xml version="1.0"?>
          <Hashtable><key>313_other_10</key><value>&#xB</value></Hashtable>
    

    虽然这看起来像有效的 XML,但在以下情况下会引发无效字符异常:

        XmlSerializer xs = new XmlSerializer(Type.GetType(Hashtable));
        StringReader stringReader = new StringReader(xml);
        obj = xs.Deserialize(stringReader);
    

    非常感谢参与帮助的人们!这是无价的帮助!

    【讨论】:

    • 好吧,您还没有说过您在该列中存储了正确的 XML 数据!那会有所帮助。我只是将普通文本内容加载到 XML 文档中。
    • 那么你是如何反序列化角色的?
    【解决方案2】:

    您是否尝试过nchar(0x0B) 而不是char(0x0B)?听起来你的狡猾角色是 Unicode。

    【讨论】:

    • 好一个!还没有尝试过。但是它不起作用。仍然返回空
    • 有罪列是 nvarchar(MAX)
    • 想知道这是否与排序规则有关。您是否尝试过使用不同的 COLLATE 子句?
    • 我也认为 COLLATE 可能是问题所在,但令我困惑的是,只要它在前 100 个左右的字符中,查询就会找到 0x0B 字符......非常不寻常!
    • 没关系..它会在任何位置找到0x0B,只要它在那里。原来我的坏数据行不包含 0x0B(请参阅我的答案)
    【解决方案3】:

    字符 0x0B 不能在 XML 文档中使用(请参阅有效 XML 字符列表 here。)请考虑将这样的无效 XML 字符迁移到有效 XML(例如序列 &amp;#xB;)。

    【讨论】:

    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 2022-01-23
    • 2011-02-23
    • 2019-04-16
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多