Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何使XML模式中的任一字段都是必填字段_Asp.net_Xml_Xsd - Fatal编程技术网

Asp.net 如何使XML模式中的任一字段都是必填字段

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

我有一个如下所示的模式,我有一些关于该模式的问题

1.如何使
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>