有关使用XmlReader验证xml的查询

时间:2011-03-28 17:16:20

标签: c# xml xsd

我对XmlReader类的体验现在已经混合了。我想澄清一下使用XmlReader类验证Xml数据时的一些基本疑问。

  1. 我知道可以使用XmlReaderSettings类来设置一些关于是否打开/关闭验证,设置验证类型等的设置。并使用xml文件和设置对象创建一个XmlReader。
  2. 我也知道你需要将用于验证的所有模式文件添加到XmlSchemaSet类中,除非模式存在于Xml文档中(内联模式)
  3. 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>
    

    Q2。此外,是否可以从xml文档中检索此文件的名称而不是硬编码?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

只是一句忠告。作为XML输入数据的验证器,您最终应该控制架构源。你怎么知道你在验证什么?

有一些用例,其中schemaLocation属性很有用。例如,Spring框架对同一名称空间使用不同的URL,以允许用户为配置文件指定默认或特定于版本的模式支持。但URL始终是符号的,并且间接指向受控的模式相关资源。

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