XSD架构命名空间问题--cvc-complex-type.2.4.a

时间:2014-01-15 22:08:31

标签: xml parsing jaxb xsd

我正在尝试读取XML文件,但他一直在抛出这个错误:

  
      
  • cvc-complex-type.2.4.a:找到无效的内容   元素'联系'。预计会有一个“{contact}”。

  •   
  • lineNumber:2; columnNumber:68; cvc-elt.1:找不到了   元素'联系人'的声明。]

  •   

我已经在网上搜索了答案。如果我删除targetNamespace,那么它不会抱怨找到元素,但它开始抱怨它无法找到tns命名空间中声明的自定义类型。

我在此验证:http://www.corefiling.com/opensource/schemaValidate.html

我正在使用JAXB来确保文档符合其架构。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="http://www.example.com/ContactsSchema"
    xmlns:tns="http://www.example.com/ContactsSchema">

    <xs:element name="contacts" type="tns:Contacts" />

    <xs:complexType name="Contacts">
        <xs:sequence>
            <xs:element name="contact" type="tns:Contact" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="Contact">
        <xs:sequence>
            <xs:element name="id" type="xs:long"/>
            <xs:element name="firstName" type="xs:string" />
            <xs:element name="lastName" type="xs:string" />
            <xs:element name="firstName" type="xs:string" />
            <xs:element name="address" type="tns:Address" />
            <xs:element name="favorite" type="xs:boolean" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Address">
        <xs:sequence>
            <xs:element name="street" type="xs:string" />
            <xs:element name="city" type="xs:string" />
            <xs:element name="state" type="xs:string" />
            <xs:element name="zip" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contacts xmlns="http://www.oracle.com/ContactsSchema" name="Test">
    <contact id="1">
        <firstName>Herman</firstName>
        <lastName>Munster</lastName>
        <address>
            <street>1313 Mockingbird Lane</street>
            <city>Camelot</city>
            <state>NJ</state>
            <zip>15490</zip>
        </address>
        <favorite>true</favorite>
    </contact>
    <contact id="2">
        <firstName>Al</firstName>
        <lastName>Bundy</lastName>
        <address>
            <street>9764 Jeopardy Lane</street>
            <city>Chicago</city>
            <state>IL</state>
            <zip>60629</zip>
        </address>
        <favorite>false</favorite>
    </contact>
</contacts>

2 个答案:

答案 0 :(得分:3)

至于@Michael的观点,您必须将XSD的targetNamespace与示例XML使用的一致。让我们假设XML是正确的,而XSD是错误的...因为存在的问题多于命名空间不匹配...

  • 您的XSD将id描述为元素,而示例XML则显示属性。
  • 您的XSD在firstName之后显示lastName,这很可能是拼写错误;尽管如此,需要将其删除以匹配XML。

这是一个与您的XML匹配的固定XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    targetNamespace="http://www.oracle.com/ContactsSchema"
    xmlns:tns="http://www.oracle.com/ContactsSchema">

    <xs:element name="contacts" type="tns:Contacts" />

    <xs:complexType name="Contacts">
        <xs:sequence>
            <xs:element name="contact" type="tns:Contact" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="Contact">
        <xs:sequence>
            <xs:element name="firstName" type="xs:string" />
            <xs:element name="lastName" type="xs:string" />
            <xs:element name="address" type="tns:Address" />
            <xs:element name="favorite" type="xs:boolean" />
        </xs:sequence>
            <xs:attribute name="id" type="xs:long"/>
    </xs:complexType>

    <xs:complexType name="Address">
        <xs:sequence>
            <xs:element name="street" type="xs:string" />
            <xs:element name="city" type="xs:string" />
            <xs:element name="state" type="xs:string" />
            <xs:element name="zip" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

答案 1 :(得分:1)

您的架构适用于命名空间http://www.example.com/ContactsSchema,但您的实例位于命名空间http://www.oracle.com/ContactsSchema中。