尝试使用一系列半有序的强制元素和可选元素验证XML Schema时收到错误

时间:2015-09-14 21:15:42

标签: xml xsd xml-parsing

我无法针对具有带可选元素的嵌套序列的XSD验证XML。 3年前的This question是相似的,但不幸的是并没有解决我的问题。以XML为例:

<root>
    <a>...</a>

    <b>...</b>
    <c>...</c>

    <b>...</b>  
    <c>...</c>
    <d>...</d>
    <d>...</d>

    <b>...</b>
    <c>...</c>
    <d>...</d>

    <END>...</END>
</root>

和我相应的XSD:

<xs:schema ...>
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>

                <xs:element name="a" type="aType"/>

                <xs:sequence minOccurs="1" maxOccurs="unbounded">
                    <xs:element name="b" type="bType"/>
                    <xs:element name="c" type="cType"/>
                    <xs:element name="d" minOccurs="0" maxOccurs="3" type="dType"/>
                </xs:sequence>

                <xs:element name="END" type="eType"/>

            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

换句话说:

  • &#34;&#34;必须发生一次,然后是:
  • 由&#34; b&#34;,&#34; c&#34;组成的嵌套序列。和&#34; d&#34;为了。然而,&#34; d&#34;是可选的,最多可以发生3次。
  • 最后,&#34;结束&#34;必须发生一次。

类型是schemaType中定义的complexType。

XSD在逻辑上代表了我想要做的事情,但并不起作用。它似乎是有效的XSD(解析器在读取XSD时不会出错)。但是我收到的错误让我相信我没有正确地构建这个错误。

这是我的JavaScript / Java代码,用于在构建DOM时使用XSD验证XML(使用Rhino JavaScript引擎,因此看起来很奇怪):

var schemaReader = Packages.java.io.StringReader(schemaString);
var schemaSource = Packages.javax.xml.transform.stream.StreamSource(schemaReader);
var schemaFactory = Packages.javax.xml.validation.SchemaFactory.newInstance(Packages.javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
var schema = schemaFactory.newSchema(schemaSource);

var dbf = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setSchema(schema);
var db = dbf.newDocumentBuilder();
db.setErrorHandler(myErrorHandler);
var xmlReader2 = Packages.java.io.StringReader(xmlString);
var xmlInputSource = Packages.org.xml.sax.InputSource(xmlReader2);

xmlDoc = db.parse(xmlInputSource);

但我得到的错误是这样的:

Error: cvc-complex-type.2.4.d: Invalid content was found starting with element 'd.10'. No child element is expected at this point.

其中d.10是类型&#34; d&#34;的最后一个子元素。

我相信我不正确地构建了XSD - 任何人都可以提出另一种方法吗?

1 个答案:

答案 0 :(得分:0)

看起来您的代码是正确的,所以问题是您的输入文件。我拿了你的XSD并对其进行了修改(但结构完好无损):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>

                <xs:element name="a" type="aType"/>

                <xs:sequence minOccurs="1" maxOccurs="unbounded">
                    <xs:element name="b" type="aType"/>
                    <xs:element name="c" type="aType"/>
                    <xs:element name="d" minOccurs="0" maxOccurs="3" type="aType"/>
                </xs:sequence>

                <xs:element name="END" type="aType"/>

            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="aType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>

使用以下XML,它遵循您的解释中的逻辑,它验证:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="xsd-choice-and%20occurrence.xsd">
    <a></a>
    <b></b>
    <c></c>
    <b></b>
    <c></c>
    <b></b>
    <c></c>
    <d></d>
    <d></d>
    <d></d>
    <b></b>
    <c></c>
    <d></d>
    <d></d>
    <d></d>
    <END></END>
</root>

d个数字可以是0到3之间的任何位置。