Допустимость xml с xsd с элементом xsi:nillable
Мой файл XML
<tns:SampleInfoResponse xsi:schemaLocation="sampleNS test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="sampleNS">
<tns:SampleInfo>
<tns:firstName>String</tns:firstName>
<tns:lastName>String</tns:lastName>
<tns:lbn>String</tns:lbn>
<tns:LSampleDetails>
<tns:SampleState>String</tns:SampleState>
<tns:SampleId>String</tns:SampleId>
<tns:sample>String</tns:sample>
<tns:status>String</tns:status>
<tns:statusDate>String</tns:statusDate>
<tns:SampleId>String</tns:SampleId>
</tns:LSampleDetails>
**<tns:LSampleEnrlDetails/>**
<tns:middleName>String</tns:middleName>
<tns:element1>String</tns:element1>
<tns:element2>String</tns:element2>
</tns:SampleInfo>
</tns:SampleInfoResponse>
МОЙ XSD файл
<xsd:schema targetNamespace="sampleNS" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="sampleNS" xmlns="http://www.w3.org/2001/XMLSchema">
<xsd:element name="SampleInfoResponse" type="tns:SampleInfoResponseV1"/>
<xsd:complexType name="SampleInfoResponseV1">
<xsd:sequence>
<xsd:element name="SampleInfo" type="tns:SampleInfVO" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SampleInfVO">
<xsd:sequence>
<xsd:element name="firstName" type="xsd:string" nillable="true"/>
<xsd:element name="lastName" type="xsd:string" nillable="true"/>
<xsd:element name="lbn" type="xsd:string" nillable="true"/>
<xsd:element name="LSampleDetails" type="tns:SampleDetailsVO" nillable="true" maxOccurs="unbounded"/>
<xsd:element name="LSampleEnrlDetails" type="tns:SampleEnrlDetailsVO" nillable="true" maxOccurs="unbounded"/>
<xsd:element name="middleName" type="xsd:string" nillable="true"/>
<xsd:element name="element1" type="xsd:string" nillable="true"/>
<xsd:element name="element2" type="xsd:string" nillable="true"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SampleDetailsVO">
<xsd:sequence>
<xsd:element name="SampleState" type="xsd:string" nillable="true"/>
<xsd:element name="SampleId" type="xsd:string" nillable="true"/>
<xsd:element name="sample" type="xsd:string" nillable="true"/>
<xsd:element name="status" type="xsd:string" nillable="true"/>
<xsd:element name="statusDate" type="xsd:string" nillable="true"/>
<xsd:element name="SampleId" type="xsd:string" nillable="true"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SampleEnrlDetailsVO">
<xsd:sequence>
<xsd:element name="element1" type="xsd:string" nillable="true"/>
<xsd:element name="element2" type="xsd:string" nillable="true"/>
<xsd:element name="element3" type="xsd:boolean"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
парсер жалуется на <tns:LSampleEnrlDetails/>
файл XML должен быть <tns:LSampleEnrlDetails xsi:nil="true"/>
только для действительного файла? Убрав весь тег, парсер тоже жалуется.
Я хотел бы знать, какие возможные случаи для этого тега <tns:LSampleEnrlDetails/>
делает файл XML действительным в соответствии с вышеуказанной схемой, когда у меня нет данных для заполнения тега <tns:LSampleEnrlDetails/>
2 ответа
Атрибут xsi:nil необходим, потому что нет никакого способа отличить элемент, содержимое которого является пустой строкой, и элемент, который не имеет содержимого (т. Е. Имеет значение null). Таким образом, вы используете атрибут, который является "вне диапазона" по отношению к текстовому содержимому.
Лично мне это не нравится, и я думаю, что есть лучшие альтернативы. Самое простое - сделать ваши элементы необязательными и пропустить их, если они содержат нулевой контент.
Используйте атрибут ниже, чтобы сделать его действительным
<tns:LSampleEnrlDetails xsi:nill="true" />