【问题标题】:How to write a XSD to validate random element names?如何编写 XSD 来验证随机元素名称?
【发布时间】:2015-04-15 06:45:18
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: c# xml xsd xsd-validation


    【解决方案1】:

    这两个 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 而非命令行调用“validation-by-type”。事实上,最简单的方法可能是从 XSLT 调用验证:

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

    然后:

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

    【讨论】:

    • 我的问题有一些错误,例如我的示例 XML 文件的根元素没有关闭。 “称其为“几乎相同的架构”似乎有点夸张”,所以您是说那些 XML 文件看起来不一样?我使用术语“几乎相同”是因为我想说所有结构有点相同,但每个请求的根元素名称不同。并感谢您令人印象深刻的回答。
    【解决方案2】:

    您需要做的就是将每个根写入架构元素的直接子级,并在 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多