如何编写 XSD 来验证随机元素名称?

How to write a XSD to validate random element names?

我编写了一个应用程序,它接收许多 XML 请求的变体。在我们的业务中,我们必须在任何请求开始时根据 XSD 验证 XML。

问题:

正如我上面所说,我必须在开始时验证它们,那些 XML 具有几乎相同的架构,我需要编写一个 general XSD 给他们。

我已经为我的问题提供了一些原型 XML:

XML1:

<_9D94DEB4-7C2D-45A5-A4FB-89FB1CF20672>
<Param1>value</Param1>
<Type>Category</Type>    
</_9D94DEB4-7C2D-45A5-A4FB-89FB1CF20672>

XML2: 几乎相同的模式,但根元素名称不同,并且它有一个额外的子元素。

<_7603DCD1-F270-43EA-86E3-0FB3161478F6>
<Param1>value</Param1>
<Type>Page</Type>    
<SearchText>Sample</SearchText>
</_7603DCD1-F270-43EA-86E3-0FB3161478F6>

如您所见,根元素名称不同,但它们的架构几乎相同,我如何为它们编写一个通用的 XSD?

提前致谢。

您需要做的就是将每个根写为架构元素的直接子元素,并在 XSD.

中定义类型

例如:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="_9D94DEB4-7C2D-45A5-A4FB-89FB1CF20672">
        ...
      <xs:complexType>
        <xs:attribute name="Param2" type="Param2" use="required">
        </xs:attribute>
        <xs:attribute name="Type" type="Type" use="required">
        </xs:attribute>
        <xs:attribute name="SearchText" type="SearchText" use="required">
        </xs:attribute>
      </xs:complexType>
        ...
    </xs:element>
    <xs:element name="_7603DCD1-F270-43EA-86E3-0FB3161478F6">
         ...
      <xs:complexType>
        <xs:attribute name="Param1" type="Param1" use="required">
        </xs:attribute>
        <xs:attribute name="Type" type="Type" use="required">
        </xs:attribute>
      </xs:complexType>
        ...
    </xs:element>
</xs:schema>

<!-- Your defenition and restriction of types-->
<xs:simpleType name="Param1">
    <xs:restriction base="xs:string">
</xs:simpleType>
<xs:simpleType name="Param2">
    <xs:restriction base="xs:string">
</xs:simpleType>
<xs:simpleType name="Type">
    <xs:restriction base="xs:string">
</xs:simpleType>
<xs:simpleType name="SearchText">
    <xs:restriction base="xs:string">
</xs:simpleType>

这两个 XML 实例的唯一共同点是它们都有一个值为字符串的 Type 元素。调用 "almost the same schema" 似乎有点夸张。但也许还有比您向我们展示的更多的共性?

原则上 XSD 允许您根据架构中的全局类型验证实例,而不管元素名称如何。您的特定模式处理器是否提供 API 来执行此操作是另一个问题。

然后您的架构可以简单地定义顶级类型:

<xs:complexType name="myTopLevelType">
  <xs:sequence>
    <xs:element name="Param1" type="xs:string"/>
    <xs:element name="Type" type="xs:string"/>
    etc
  </xs:sequence>
</xs:complexType>

如果您选择 Saxon 作为您的架构验证器,那么您可以从 Java API 但不能从命令行调用 "validation-by-type"。事实上,最简单的方法可能是从 XSLT 调用验证:

<xsl:import-schema schemaLocation="mySchema.xsd"/>

然后:

<xsl:copy-of select="doc('instance.xml')/*" type="myTopLevelType"/>