Атрибут XSD NILLABLE не работает - PullRequest
9 голосов
/ 26 июля 2011

Я работаю над получением XML-файла для проверки по схеме XSD, и у меня возникают проблемы с проверками. Каждый раз, когда я проверяю, я получаю сообщение об ошибке

"Ошибка достоверности схемы: элемент '{http://services.website.com/ProgramResponse}Population':' 'не является допустимым значением атомарного типа' xs: double '."

Я полагаю, что эта ошибка происходит, потому что у меня в этом поле есть нулевой символ, отображаемый так:

Итак, чтобы решить эту проблему, я попытался использовать атрибут nillable = "true" для элементов, чтобы они могли быть нулевыми, но все равно отображаться как пустые. Кажется, это единственное решение, но оно совсем не работает. Я все еще получаю ошибки.

В настоящее время я использую XMLMate для своих проверок, и я дважды проверил его и несколько онлайн-верификаторов. Ошибка все еще сохраняется. Любые предложения будут великолепны.

<?xml version="1.0" encoding="UTF-8"?>

<xsd:element name="Reports" type="tns:ReportsType"/>

<xsd:complexType name="ReportsType">
    <xsd:sequence>
        <xsd:element name="Report" type="tns:ReportType" maxOccurs="unbounded" minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="ReportType">
    <xsd:sequence>
        <xsd:element name="Id" nillable="true"/>
        <xsd:element name="Brand" type="xsd:string"/>
        <xsd:element name="Address" type="xsd:string"/>
        <xsd:element name="City" type="xsd:string"/>
        <xsd:element name="State" type="xsd:string"/>
        <xsd:element name="ZipCode" type="xsd:string"/>
        <xsd:element name="Entry" type="tns:EntryType" maxOccurs="unbounded" minOccurs="1"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="EntryType">
    <xsd:sequence>
        <xsd:element name="RM" nillable="true" type="xsd:double"/>
        <xsd:element name="Pop" nillable="true" type="xsd:double"/>
        <xsd:element name="Wt" nillable="true" type="xsd:double"/>
        <xsd:element name="EntryId" type="xsd:int"/>
    </xsd:sequence>
</xsd:complexType>

Ответы [ 2 ]

11 голосов
/ 26 июля 2011

Узел, подобный < HarvPop>< /HarvPop>, утверждает, что значение есть, и что его значение является пустой строкой.

На основе информации на этой странице w3.org: http://www.w3.org/TR/xmlschema-0/#Nils

Атрибут nillable используется следующим образом:

Определение: <xsd:element name="shipDate" type="xsd:date" nillable="true"/>

Использование: <shipDate xsi:nil="true"></shipDate>

т.е. Вы должны специально указать, что значение равно нулю.

Другой способ сделать это - указать minoccurs = 0, чтобы пропустить значение.

4 голосов
/ 29 июля 2011

Один из способов, который я обнаружил и решает проблему с минимальным кодом, - добавить атрибут XSD по умолчанию = "0".Это позволяет вам проверять как двойное без необходимости иметь дело с nil, установив nil по умолчанию в число.

Ошибка десериализации XML-документа со строго типизированным XSD

...