Asp.net 如何使XML模式中的任一字段都是必填字段
我有一个如下所示的模式,我有一些关于该模式的问题 1.如何使Asp.net 如何使XML模式中的任一字段都是必填字段,asp.net,xml,xsd,Asp.net,Xml,Xsd,我有一个如下所示的模式,我有一些关于该模式的问题 1.如何使CourierNumber或WorkLocationCoordination成为必填项。我使用了如下所示的一种全局类型 编辑 正如Abel提到的,我修改了模式,但是失败了 <?xml version="1.0" encoding="utf-8"?> <NOCPlantMapRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="h
CourierNumber
或WorkLocationCoordination
成为必填项。我使用了如下所示的一种全局类型
编辑
正如Abel提到的,我修改了模式,但是失败了
<?xml version="1.0" encoding="utf-8"?>
<NOCPlantMapRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<NOCTypeID>0</NOCTypeID>
<WorkLocation>
<ParcelNumber>4545</ParcelNumber>
<Roads>
<WorkLocationRoad>
<RoadName>dubai road</RoadName>
</WorkLocationRoad>
</Roads>
<WorkArea>
<WorkArea>
<Coordinates>
<WorkLocationCoordinate>
<CoordinateX>56</CoordinateX>
<CoordinateY>23</CoordinateY>
</WorkLocationCoordinate>
</Coordinates>
<Communities />
</WorkArea>
</WorkArea>
</WorkLocation>
</NOCPlantMapRequest>
我的主要要求是
ParcelNumber
或WorkLocationCoordinationType
应该显示,出了什么问题?您需要修改“CourierNumber”元素的定义以包含所需的属性。更新此代码:
<xsd:element name="CourierNumber" type="xs:string"/>
为此:
<xsd:element name="CourierNumber">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="Option" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
参考自
如果在内联中定义元素的类型,则无法命名它,因此请删除type=“WorkLocationCoordinate”
属性(然后删除name=“WorkLocationCoordinate”
属性)
如果要使用这些属性,则需要分离元素和类型定义,例如
和..
有关您在注释中提到的错误的更多信息,请参见您需要修改“CourierNumber”元素的定义以包含所需的属性。更新此代码:
<xsd:element name="CourierNumber" type="xs:string"/>
为此:
<xsd:element name="CourierNumber">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="Option" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
参考自
如果在内联中定义元素的类型,则无法命名它,因此请删除type=“WorkLocationCoordinate”
属性(然后删除name=“WorkLocationCoordinate”
属性)
如果要使用这些属性,则需要分离元素和类型定义,例如
和..
有关您在评论中提到的错误的更多信息,请参阅
1.如何强制使用CourierNumber或WorkLocationCoordinate。我使用了如下所示的一种全局类型
在您给定的代码中,这两个定义并不紧密(一个在第二个子级别,另一个嵌套很深),因此我很难理解您的意思
不可能在同一级别(相同XPath)有两个名称相同但类型不同的元素。如果您尝试它,您将得到(取决于您的XSD解析器):
如果您可以使用XSD1.1,那么您就可以。由于WorkArea
中唯一的信息是坐标,我假设您的意思是在第一个位置的CourierNumber
或第二个位置的WorkArea
之间切换,但不是两者都切换(实际上,它有助于显示包含所需变量的实例文档)
如果是,那么如何应用元素名称CourierNumber和WorkLocationCoordinate中的类型,因为'CourierNumber'已经包含xsd:unsignedShort类型
这才是你真正的问题所在。由于不使用命名类型(所有内容都是具有匿名复杂类型定义的一个大元素),因此无法引用这些类型。一种解决方案是重复这些定义,但这可能会变得单调乏味,并且有其局限性
下面我为您提供的解决方案只是将代码重构为“类型优先”的方法。也就是说,您得到的不是一个大的(难以读取的)元素定义,而是命名类型定义的小块。意见可能会有所不同,但我认为这更具可读性,而且肯定更灵活。A
这验证了以下任一情况:
<Request>
<Location>
<CourierNumber>12</CourierNumber>
<Roads></Roads>
</Location>
</Request>
12
或者这个:
<Request>
<Location>
<Roads></Roads>
<WorkArea>
<WorkArea>
<Coordinates>
<WorkLocationCoordinate>
<CoordinateX>34</CoordinateX>
<CoordinateY>66</CoordinateY>
</WorkLocationCoordinate>
</Coordinates>
</WorkArea>
</WorkArea>
</Location>
</Request>
34
66
1.如何强制使用CourierNumber或WorkLocationCoordinate。我使用了如下所示的一种全局类型
在您给定的代码中,这两个定义并不紧密(一个在第二个子级别,另一个嵌套很深),因此我很难理解您的意思
不可能在同一级别(相同XPath)有两个名称相同但类型不同的元素。如果您尝试它,您将得到(取决于您的XSD解析器):
如果您可以使用XSD1.1,那么您就可以。由于WorkArea
中唯一的信息是坐标,我假设您的意思是在第一个位置的CourierNumber
或第二个位置的WorkArea
之间切换,但不是两者都切换(实际上,它有助于显示包含所需变量的实例文档)
如果是,那么如何应用元素名称CourierNumber和WorkLocationCoordinate中的类型,因为'CourierNumber'已经包含xsd:unsignedShort类型
这才是你真正的问题所在。由于不使用命名类型(所有内容都是具有匿名复杂类型定义的一个大元素),因此无法引用这些类型。一种解决方案是重复这些定义,但这可能会变得单调乏味,并且有其局限性
下面我为您提供的解决方案只是将代码重构为“类型优先”的方法。也就是说,您得到的不是一个大的(难以读取的)元素定义,而是命名类型定义的小块。Opi
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified"
elementFormDefault="qualified">
<!-- belonging to SO question https://stackoverflow.com/questions/33183835/how-to-make-either-of-the-fields-mandatory-in-xml-schema -->
<xsd:complexType name="CoordinatesType">
<xsd:sequence>
<xsd:element name="WorkLocationCoordinate" type="WorkLocationCoordinateType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:simpleType name="CourierNumberType">
<xsd:restriction base="xsd:unsignedShort"/>
</xsd:simpleType>
<xsd:complexType name="WorkLocationCoordinateType">
<xsd:sequence>
<xsd:element name="CoordinateX" type="xsd:unsignedByte" />
<xsd:element name="CoordinateY" type="xsd:unsignedByte" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="WorkAreaType">
<xsd:sequence>
<xsd:element name="WorkArea">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Coordinates" type="CoordinatesType" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="LocationType">
<xsd:choice>
<xsd:sequence>
<xsd:element name="CourierNumber" type="CourierNumberType" />
<xsd:element name="Roads" />
</xsd:sequence>
<xsd:sequence>
<xsd:element name="Roads" />
<xsd:element name="WorkArea" type="WorkAreaType" />
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
<xsd:element name="Request">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Location" type="LocationType" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<Request>
<Location>
<CourierNumber>12</CourierNumber>
<Roads></Roads>
</Location>
</Request>
<Request>
<Location>
<Roads></Roads>
<WorkArea>
<WorkArea>
<Coordinates>
<WorkLocationCoordinate>
<CoordinateX>34</CoordinateX>
<CoordinateY>66</CoordinateY>
</WorkLocationCoordinate>
</Coordinates>
</WorkArea>
</WorkArea>
</Location>
</Request>