我编写了一个应用程序,它接收许多XML请求的变体。在我们的业务中,我们必须在任何请求开始时针对XSD验证XML。
问题:
正如我上面所说,我必须在开始时验证它们,并且这些XML具有几乎相同的模式,我需要为它们编写通用 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?
提前致谢。
答案 0 :(得分:0)
您需要做的就是将每个根作为schema元素的直接子元素编写,并在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>
答案 1 :(得分:0)
这两个XML实例的唯一共同点是两个都有一个Type元素,其值是一个字符串。称“几乎相同的架构”似乎是一种夸张。但也许比你向我们展示了更多的共性?
原则上,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调用“按类型验证”,但不能从命令行调用。实际上,最简单的方法是从XSLT调用验证:
<xsl:import-schema schemaLocation="mySchema.xsd"/>
然后:
<xsl:copy-of select="doc('instance.xml')/*" type="myTopLevelType"/>