【问题标题】:Restrict the a XML request attribute value and few of the element value限制一个 XML 请求属性值和少数元素值
【发布时间】:2017-09-28 10:35:13
【问题描述】:

这个帖子是帖子的扩展:Restrict the attribute value and the value of the element using XSD

现在我可以使用 XSD 限制所有属性和元素值。但我现在希望只限制元素值中的一两个,而不是全部。

XML:

<response src="XML">
  <resp name="JSON">letter.c</resp>
  <resp name="SWAGGER">di.js</resp>
  <resp name="BI">bi.j</resp>
</response>

XSD:

<xs:schema attributeFormDefault="unqualified"
          elementFormDefault="qualified"
          xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="response">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="resp" maxOccurs="14" minOccurs="1">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="respFilter">
                                <xs:attribute name="name" use="required" 
                                              type="Enum" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="src" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="XML"></xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="Enum">
        <xs:restriction base="xs:string">
            <xs:enumeration value="JSON">
            </xs:enumeration>
            <xs:enumeration value="SWAGGER">
            </xs:enumeration>
            <xs:enumeration value="BI">
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="respFilter">
        <xs:restriction base="xs:string">
            <xs:minLength value="0"></xs:minLength>
            <xs:maxLength value="1064"></xs:maxLength>
            <xs:enumeration value="letter.c"/>
            <xs:enumeration value="di.js"/>
            <xs:enumeration value="bi.j"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

此 XSD 仅允许上面的 XML 请求,如果它具有以下值:

letter.c
di.js
bi.j

但我现在要做的是动态允许少量元素值,以便 XSD 验证以下所有请求。

1.

<response src="XML">
  <resp name="JSON">letter.c</resp>
  <resp name="SWAGGER"></resp>
  <resp name="BI">bi.j</resp>
</response>

2.

<response src="XML">
  <resp name="JSON">letter.c</resp>
  <resp name="SWAGGER">23.x</resp>
  <resp name="BI">bi.j</resp>
</response>

3.

<response src="XML">
  <resp name="JSON">letter.c</resp>
  <resp name="SWAGGER">di.js</resp>
  <resp name="BI">dj.c</resp>
</response>

所以基本上,属性 JSON 将始终具有 letter.c,JSON 中除了 letter.c 之外的任何内容都应该被 XSD 丢弃。另一方面,属性 SWAGGER & BI 可以包含任何值或空值。

【问题讨论】:

  • 即使没有完全理解你想要做什么,感觉就像你需要 XSD 1.1 来进行验证。 (1)这是一个选择吗? (2) 您的要求不明确:至少说明JSON 中除了 letter.c 以外的任何内容都应被 XSD 丢弃。意识到 XSD 用于验证,它不会丢弃任何东西。
  • 1. XSD 1.1 在这里不是一个选项。 2. 我的意思是说,如果除了 letter.c 之外的任何东西作为 JSON 中的值出现,它不应该被 XSD 验证。我用错了词把它丢了。

标签: xsd xsd-validation


【解决方案1】:

为了使验证因@name 的值而异,您需要来自 XSD 1.1 的断言或条件类型分配。如果您受限于 XSD 1.0,则必须针对 XSD 带外测试约束,或者您必须重新设计 XML 以减少元数据:

<response src="XML">
  <JSON>letter.c</JSON>
  <SWAGGER>di.js</SWAGGER>
  <BI>bi.j</BI>
</response>

在 XSD 1.0 中,此 XML 可以使用 JSON 的固定值和 SWAGGERBI 的枚举。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2020-06-03
    • 2014-12-18
    • 1970-01-01
    相关资源
    最近更新 更多