XML验证:从element开始发现无效内容

时间:2015-03-06 11:19:38

标签: java xml xsd xsd-validation xml-validation

我正面临这个问题而无法解决问题。 我有这个xsd OFX.xsd。我希望使用此模式验证的xml如下:

<?xml version="1.0"?>
<OFX>
    <SIGNONMSGSRSV1>
        <SONRS>
            <STATUS>
                <CODE>0</CODE>
                <SEVERITY>INFO</SEVERITY>
            </STATUS>
            <DTSERVER>20120716233626.570[-7:PDT]</DTSERVER>
            <LANGUAGE>ENG</LANGUAGE>
            <FI>
                <ORG>Symitar</ORG>
                <FID>01182</FID>
            </FI>
            <INTU.BID>01182</INTU.BID>
            <INTU.USERID>66983</INTU.USERID>
        </SONRS>
    </SIGNONMSGSRSV1>
    <BANKMSGSRSV1>
        <STMTTRNRS>
            <TRNUID>0</TRNUID>
            <STATUS>
                <CODE>0</CODE>
                <SEVERITY>INFO</SEVERITY>
            </STATUS>
            <STMTRS>
                <CURDEF>USD</CURDEF>
                <BANKACCTFROM>
                    <BANKID>
                    </BANKID>
                    <ACCTID>66983-S80</ACCTID>
                    <ACCTTYPE>CHECKING</ACCTTYPE>
                </BANKACCTFROM>
                <BANKTRANLIST>
                    <DTSTART>20120501</DTSTART>
                    <DTEND>20120716</DTEND>
                    <STMTTRN>
                        <TRNTYPE>FEE</TRNTYPE>
                        <DTPOSTED>20120713135400</DTPOSTED>
                        <TRNAMT>-25.00</TRNAMT>
                        <FITID>30403620120713WF</FITID>
                        <NAME>Account Transaction</NAME>
                        <MEMO>Withdrawal Fee</MEMO>
                    </STMTTRN>
                </BANKTRANLIST>
                <LEDGERBAL>
                    <BALAMT>-254.64</BALAMT>
                    <DTASOF>20120716233626</DTASOF>
                </LEDGERBAL>
                <AVAILBAL>
                    <BALAMT>-254.64</BALAMT>
                    <DTASOF>20120716233626</DTASOF>
                </AVAILBAL>
            </STMTRS>
        </STMTTRNRS>
    </BANKMSGSRSV1>
</OFX>

当我尝试在线或使用java代码验证此xml时。我收到了以下错误。

cvc-complex-type.2.4.d: Invalid content was found starting with element 'SEVERITY'
cvc-complex-type.2.4.d: Invalid content was found starting with element 'DTSERVER'
cvc-complex-type.2.4.d: Invalid content was found starting with element 'FID'
and so on....

建议我xsd中的错误是什么。

3 个答案:

答案 0 :(得分:1)

您可以选择多种类型

<xs:complexType name="SONRS">
        <xs:choice>
            <xs:element name="STATUS" type="STATUS" minOccurs="0"
                maxOccurs="1" />
            <xs:element name="DTSERVER" type="xs:string" minOccurs="0"
                maxOccurs="1" />
            <xs:element name="LANGUAGE" type="xs:string" minOccurs="0"
                maxOccurs="1" />
            <xs:element name="DTPROFUP" type="xs:string" minOccurs="1"
                maxOccurs="1" />
            <xs:element name="DTACCTUP" type="xs:string" minOccurs="0"
                maxOccurs="1" />
            <xs:element name="FI" type="FI" minOccurs="0" maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

同样适用于STATUS。所以你应该只包含一个用于SONRS的xml元素,如果你包含STATUS,你有:

<xs:complexType name="STATUS">
        <xs:choice>
            <xs:element name="CODE" type="xs:integer" minOccurs="0"
                maxOccurs="1" />
            <xs:element name="SEVERITY" type="xs:string" minOccurs="0"
                maxOccurs="1" />
            <xs:element name="MESSAGE" type="xs:string" minOccurs="0"
                maxOccurs="1" />
        </xs:choice>
    </xs:complexType>

所以你应该包括CODE或SEVERITY或MESSAGE。

答案 1 :(得分:1)

正如我在评论中提到的那样。 问题出在架构上,它定义了元素类型,但架构中没有提到元素,因此解析器抛出了无效内容的错误。

答案 2 :(得分:0)

您已声明<xs:choice>

等所有内容
    <xs:complexType name="STATUS">
        <xs:choice>
            <xs:element name="CODE" type="xs:integer" minOccurs="0" maxOccurs="1"/>
            <xs:element name="SEVERITY" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="MESSAGE" type="xs:string" minOccurs="0" maxOccurs="1"/>
        </xs:choice>
    </xs:complexType>

<xs:sequence><xs:all>

中进行更改
   <xs:complexType name="STATUS">
        <xs:sequence>
            <xs:element name="CODE" type="xs:integer" minOccurs="0" maxOccurs="1"/>
            <xs:element name="SEVERITY" type="xs:string" minOccurs="0" maxOccurs="1"/>
            <xs:element name="MESSAGE" type="xs:string" minOccurs="0" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

Choice reference here XML Schema choice元素只允许声明中包含的一个元素出现在包含元素中。

XSD Indicators reference