【问题标题】:XSD definition for empty or null object type空或空对象类型的 XSD 定义
【发布时间】:2016-09-19 07:13:13
【问题描述】:

如果 XML 输出为 null 或空列表,我正在尝试从 XML 输出中删除它。如果该特定列表或对象为空或为空,我们是否可以在 XSD 文件中定义不添加 XML 文件的方法。例如: <MergerList></MergerList>;这里没有要显示的值,所以我希望使用 xsd 定义将其删除。当然我可以在我的代码中使用检查,但我希望它使用 XSD 定义来完成。

【问题讨论】:

  • 为空,因此不应成为要生成的 XML 的一部分。

标签: xml xsd xsd-validation xml-validation


【解决方案1】:

如果 XML 输出为空或空列表,我正在尝试从 XML 输出中删除它。如果特定的列表或对象为空或为空,我们是否可以在 XSD 文件中定义不添加到 XML 文件中。

不,不是直接。 XSD 的工作是验证 XML 文件是否满足词汇和语法约束。它本身会添加或删除元素。

但是,您可以使用 XSD 来指定元素不能为空。例如,MyString 的长度可能需要大于 1

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="MyString">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:minLength value="1"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema>

或者MergeList 可能需要至少有一个子元素:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="MergeList">
    <xs:complexType>
       <xs:sequence>
          <xs:element name="Merge" minOccurs="1" type="xs:string"/>
       </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

直接删除空元素,您必须编写代码来解析 XML 并删除它们。 XSLT 是一个很好的工具;提示:修改身份转换以复制除相关空元素之外的所有元素。

【讨论】:

    【解决方案2】:

    拉克什

    这可以通过对字段设置限制来实现,这样它们就不会验证它们是否存在但为空。如果您使用验证,这些不会自动删除字段,但是您将强制客户端以您想要的方式发送消息。 XSD 无法为您删除该字段,因为它只是一个定义,而不是解析器。

    例如,如果您只想要包含 1 个或多个条目的合并列表,如果不想要合并列表,则可以将其放入您的架构中,如下所示。

    <xs:element name="Mergerlist" type="MergerListType" minOccurs="0"/>
    
      <xs:complexType name="MergerListType">
        <xs:sequence>
          <xs:element type="xs:string" name="merger"/>
        </xs:sequence>
    </xs:complexType>
    

    现在merge 元素的默认minOccurs 为1。Zo 没有合并的mergelist 是无效的。但是没有合并列表是有效的,因为合并列表的 minOccurs 为 0。

    当涉及到元素时,您可以使用如下限制:

     <xs:element name="notNullField" minOccurs="0" type="minimalString"/>
    
      <xs:simpleType name="minimalString">
        <xs:restriction base="xs:string">
          <xs:minLength value="1" />
        </xs:restriction>
      </xs:simpleType>
    

    重要的是要记住在 xml 中指示空值的正确方法如下:

     <Element xsi:nil="true"/> 
    

    在您的 xsd 中,您可以像这样定义这个字段:

     <xs:element name ="Element" nillable="true"/>
    

    这样,客户端可以正确地指示空值并区分空字符串或空字符串。

    这将允许您创建一个必须具有最小长度的字段,或者像这样为 null:

     <xsd:element name="notNullField" nillable="true" type="tns:minimalString"/>
    
      <xsd:simpleType name="minimalString">
        <xsd:restriction base="xsd:string">
          <xsd:minLength value="1" />
        </xsd:restriction>
      </xsd:simpleType>
    

    但这仍然不会删除字段,并且不会自动发生。然而,这可以使用转换来完成。这里有很多关于如何在 stackoverflow 上使用 xslt 删除空节点的示例。

    所以基本上你的选择是:

    • 强制您的客户端使用 xsd 发送您想要的 XML 消息。 (首选)
    • 使用 xsl 转换去除空元素
    • 编写处理空节点的代码。

    【讨论】:

    • 感谢您回答我的问题。在我的情况下, 是复杂类型。
    • 这应该不会有太大的不同。原则保持不变。但是我会更新这个例子。如果您可以像现在一样添加 xsd 的示例,那将变得更加容易。
    猜你喜欢
    • 2020-11-26
    • 2020-01-08
    • 2012-06-29
    • 2016-04-23
    • 1970-01-01
    • 2017-01-21
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多