【问题标题】:SQL 2005 XML Special/Escaped Characters from System.Xml.XmlDocument.OuterXmlSystem.Xml.XmlDocument.OuterXml 中的 SQL 2005 XML 特殊/转义字符
【发布时间】:2009-06-16 10:00:30
【问题描述】:

我有一些使用 C# 中的 XmlDocument 对象创建的 XML。

然后,我使用 XmlDocument.OuterXml 方法将 xml 数据插入到 SQL 2005 中的 XML 列中以获取原始 xml。

我遇到的问题是 xml 包含一些特殊字符。即: 这是因为 xml 是根据来自各种来源的用户输入构建的。

当我执行插入时,我收到一条 SQL 错误消息,指出 XML 解析:非法 xml 字符。

CREATE TABLE #MyTable (MyColumn XML)
INSERT INTO #MyTable VALUES ('<Element>&#x1F;&#x1C;</Element>')

消息 9420,第 16 级,状态 1,第 2 行

XML 解析:第 1 行,字符 15,非法 xml 字符

有人可以指点我如何解决这个问题吗?

我很难更改 XmlDocument 对象或原始 xml 本身的任何内容,但是,我可以更改用于获取 RAW XML 的机制。如果需要,我还可以更改我的数据库设置。

【问题讨论】:

    标签: .net sql xml sql-server-2005


    【解决方案1】:

    如果您有一个包含无效字符的 XmlDocument,那么您基本上没有得到有效的 XML。除了制表符、回车和换行符之外,没有其他方法可以表示 U+0020 以下的任何内容。我不完全确定为什么,但根据规范,它是无效的 XML。

    您可以将无效 XML 的原始 text 存储在数据库中,但我认为您首先希望它成为 XML 列是有原因的 :)

    您真的想保留这个无效的 XML 吗?您知道它来自哪里以及是否需要它吗?我个人会尽可能地清理数据。

    (顺便说一句,第一个 Stack Overflow 数据转储有一个非常相似的问题,所以不只是你 :)

    【讨论】:

    • 有没有办法让 XmlDocument 对象强制执行相同的验证规则?这些字符来自用户键入/粘贴到 html 文本框中,然后将此 TextBox.Text 分配给 XmlNode.InnerText。如果它是无效的 XML,我很惊讶它此时没有崩溃。
    • 我不需要保留无效数据。这是来自网页的所有用户输入,因此不确定任何转义字符是如何进入那里的。我想清理它,我只需要一个优雅的解决方案。我找到了通过循环遍历整个字符串来去除无效字符的代码。这对我来说似乎是错误的,我不应该编码哪些字符是有效的,哪些不是。
    • 同意 - 有点乱。不幸的是,我不知道一个优雅的解决方案:(
    • 好吧,如果 Jon Skeet 不知道,那么我们其他人就没有希望了;)我将在将 XML 放入数据库之前删除字符。我有数以百万计的这些 XML 文件,我确信其中只有少数会包含无效字符,它们将一团糟,并确保它们永远不会再变得“坏”。感谢您的帮助。
    【解决方案2】:

    这是可能的 INSERT INTO #MyTable VALUES ('')

    为了清楚起见,我现在添加空格

    INSERT INTO #MyTable VALUES (' & a m p ;# x 1 F ;l e m e n t > ')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2019-05-09
      相关资源
      最近更新 更多