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