如何编写 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"/>
我编写了一个应用程序,它接收许多 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"/>