有没有办法限制根 xml 元素名称应该与 XSD 文件中的相同?

Posted

技术标签:

【中文标题】有没有办法限制根 xml 元素名称应该与 XSD 文件中的相同?【英文标题】:Is there any way to restrict root xml element name should be same as in XSD file? 【发布时间】:2021-10-15 04:59:15 【问题描述】:

我有一个带有这样标签的 XML 文件..

<DataSt> --ROOT TAG
  <Track>
....
  </Track>
</DataSt>

我有这样开始的 XSD 文件..

<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="DataSt">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="Track">
          <xs:complexType>
            <xs:sequence>
              .................

我想在 XSD 文件中定义一些规则,根标签名称应始终与“DataSt”相同

例如如果

<DataSt1> --ROOT TAG(wrong)
  <Track>
....
  </Track>
</DataSt1>

它不应该被成功验证,它应该有助于抛出错误。

我正在使用 SSIS 在 XSD 文件的帮助下从 XML 传输数据。如果根标签与 XSD 文件中定义的不同,则 SSIS 在读取 xml 文件后只是跳过它,但不会抛出错误。

我对 XML 和 XSD 代码了解不多。请帮助解决这个问题。谢谢!!!

【问题讨论】:

这可能取决于解析器/验证器 API,如果根元素与任何架构***元素不匹配,您是否以及如何配置为进行严格验证并引发错误或警告。我认为,如果您将 system.xml.schema.xmlschemavalidationflags 设置为报告警告,那么使用 .NET API 会在您的情况下收到警告。我不知道 SSIS 在后台使用了什么。 【参考方案1】:

XSD 的设计者选择不这样做(有很多争论)。据我了解,其基本原理是模式定义了元素的有效性,而不是文档的有效性(但 xs:ID/IDREF 机制破坏了该原则)。

一些架构验证 API 允许您限制***元素应该是什么。例如,如果您从命令行使用 Saxon 进行验证,则有一个选项 -top(参见 https://www.saxonica.com/documentation10/index.html#!schema-processing/commandline)

【讨论】:

以上是关于有没有办法限制根 xml 元素名称应该与 XSD 文件中的相同?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用混合值(整数和字符串)限制更改XML / XSD中的complexType?

XML, DTD, XSD, SGML

Apache XMLSchema 核心 XSD/XML 解析器将根元素显示为所有子元素的父元素,而不是其直接父元素

XML的Schema约束

带有来自其他命名空间的元素的 XSD

有没有办法处理 JAXB 中多个 .xsd 文件中的重复元素定义?