【问题标题】:Evaluate XML Find Bad Character?评估 XML 发现坏字符?
【发布时间】:2012-01-03 21:11:49
【问题描述】:

我有一些来自远程 (Java) Web 服务的 XML 进入我的 c# 控制台应用程序,它通过存储过程写入 Microsoft SQL Server XML 列。有时 XML 的某个地方有错误的字符,而 SQL Server 没有提供足够的信息来说明问题的确切位置。

我想在数据库写入发生之前评估 XML,当然我没有 XSD。

在写入数据库之前评估 XML 的每个部分是否符合“常规一致性”的好方法是什么?我正在使用 .NET 4.0、C#。

谢谢。

【问题讨论】:

  • 你得到什么错误?你在使用参数吗?
  • 只需将其加载到 xml 文档或类似文件中。捕获异常,隔离数据等。当然,假设当您将其从 Web 服务中取出时它已损坏,而不是在您将其发送到 sp 时编码混乱。
  • 只需使用XmlReader.Create() 打开文档,然后使用XmlReader.Read() 遍历每个节点。
  • 它真的是一个坏字符...还是代码没有设置为读取正确的字符集,而坏字符是其集合中的有效字符,比如代码正在读取 UTF 上的 ASCII -8 情景???

标签: c# xml xml-parsing


【解决方案1】:

如果您有可能,我建议您对您在 3rd 方服务中检索的所有 XML 数据进行 XML 架构验证。

Xml Schema 验证将确保 XML 文档的每个元素都对其定义的合同有效。

您应该考虑将 Xml Schema Validation 设为可选,因为它引入了开销,您可能希望在生产环境中避免这种开销。但在开发和测试环境中,从所有 3rd 方服务中获取详细的验证错误信息会非常有益。

【讨论】:

    【解决方案2】:

    您可以尝试清理您的 xml,这可能会有所帮助:http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/

    该链接实际上只有助于过滤无效字符,大多数时候,这还不够也没有帮助(但是我仍然建议过滤未知字符以确保安全)。

    我认为要检查标签是否有效,您可以使用 try catch。如果 try catch 在第 1 行返回问题,那么问题可能是您的 xml 中没有根元素?或者可能是您对 xml 文档的编码不正确。它们应该返回不同的错误。

    【讨论】:

    • -1:清理垃圾仍然会产生垃圾。您不知道文档的作者认为坏字符代表什么。
    • 您不需要删除已清理的字符,您可以将它们转换为被视为 cmets 的标签,或者您可以在找到它们的确切行上找到它们时抛出异常。仅仅因为该示例显示了一种过滤方式,并不意味着您必须删除或清理。你可以对这些角色做任何你想做的事
    • 除了理解它们为什么存在之外的任何东西。
    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 2020-04-15
    • 1970-01-01
    • 2014-01-28
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多