空或空对象类型的XSD定义

时间:2016-09-19 07:13:14

标签: xml xsd xsd-validation xml-validation

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

2 个答案:

答案 0 :(得分:1)

  

如果它是null或空列表,我试图从XML输出中删除XML标记。有没有办法我们可以在XSD文件中定义如果特定的List或对象为null或为空则不添加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是一个很好的工具;提示:修改身份转换以复制所有问题的空元素。

答案 1 :(得分:0)

勒凯什

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

例如,如果您只想要包含一个或多个条目的合并列表,如果不是,则不需要合并列表,而不是将其放在模式中,如下所示。

<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>

现在merger元素的默认minOccurs为1. Zo没有合并的合并列表无效。但是没有mergerlist是有效的,因为mergerlist的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转换来消除空元素
  • 编写处理空节点的代码。