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

时间:2015-04-15 06:45:18

标签: c# xml xsd xsd-validation

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

提前致谢。

2 个答案:

答案 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"/>