【问题标题】:Queries about validating xml with XmlReader关于使用 XmlReader 验证 xml 的查询
【发布时间】:2011-03-28 17:16:19
【问题描述】:

我现在对 XmlReader 类的体验有点复杂。我确实想澄清一些关于使用 XmlReader 类验证 Xml 数据的基本疑问。

  1. 我知道可以使用 XmlReaderSettings 类来设置是否打开/关闭验证、设置验证类型等设置。并使用 xml 文件和设置对象创建一个 XmlReader。
  2. 我还知道您需要将所有用于验证的架构文件添加到 XmlSchemaSet 类中,除非该架构存在于 Xml 文档中(内联架构)

XmlSchemaValidationFlags 类中有一个名为 XmlSchemaValidationFlags.ProcessSchemaLocation 的属性

那么,如果我确实在下面给出的 xml 文件中指定了 xsd 文件的位置,我是否需要将 xsd 文件添加到 XmlSchemaSet 类?我将 xsd 文件保存在与 xml 文件相同的目录中。

<?xml version="1.0" encoding="utf-8"?>
<value_tables xmlns="urn:values-schema"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:values-schema values.xsd"
              >
  <table name="Calibrated">
    <value num="0">No</value>
    <value num="1">Yes</value>
  </table>
</value_tables>

第二季度。另外,是否可以从 xml 文档中检索该文件的名称而不是对其进行硬编码?

【问题讨论】:

    标签: c# xml xsd


    【解决方案1】:

    您通常需要提供一个解析器 (google EntityResolver),它告诉解析器在哪里可以找到外部引用的文档。是的,您可以让解析器直接从命名空间 URI 获取位置信息(但不建议这样做;我想我记得一些 XBRL 分类法使用这种方法 IIRC)。

    可能有也可能没有默认的 EntityResolver 实现来做简单的事情(例如:查看单个目录或从 URI 作为 http url 下载),但根据我的经验,我总是不得不以一种或另一种方式编写 EntityResolve .反正工作量也不大

    【讨论】:

    • 太好了,我会调查的。我想即使是 XmlResolver 类也可以工作。顺便说一句,为什么不建议解析器直接从命名空间 URI 获取位置信息?
    • 因为它会将您的 XML 内容与特定的基础设施/连接联系起来。通过使解析器的工作方式可配置,您可以使其按想要的方式工作,并且更加灵活
    【解决方案2】:

    只是一个忠告。作为 XML 输入数据的验证者,您绝对应该控制模式源。你怎么知道你验证的对象是什么?

    在某些用例中,schemaLocation 属性很有用。例如,Spring 框架对同一个命名空间使用不同的 URL,让用户为配置文件指定默认或版本特定的模式支持。但 URL 始终是象征性的,并间接指向受控架构相关资源。

    但是,如果用例是要获取有关 XML 文档中元素和属性的架构相关信息,则此方法不适用。

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多