2013-01-21 39 views
2

我有一個XSD來驗證XML文件,但我得到的錯誤Invalid content was found starting with element 'user'. One of '{user}' is expected.XML模式驗證,無效的有效內容

如果我更改命名空間聲明xmlns:synchronisation="synchronisation",並把synchronisation:syncQueryMapping爲根標籤,但保留其餘的都一樣,這是驗證,但我不明白爲什麼這個工程,爲什麼它是必要的,爲什麼其餘的標籤不需要它。

我似乎無法理解&解決了這個問題,所以任何幫助將不勝感激!

謝謝!

的xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<syncQueryMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="synchronisation" 
    xsi:schemaLocation="synchronisation syncQueryMappingSchema.xsd"> 

    <user> 
     <tableName></tableName> 
     <nameColumn></nameColumn> 
     <passwordColumn></passwordColumn> 
    </user> 
    <group> 
     <tableName></tableName> 
     <nameColumn></nameColumn> 
    </group> 
    <userGroupMapping> 
     <tableName></tableName> 
     <userNameColumn></userNameColumn> 
     <groupNameColumn></groupNameColumn> 
    </userGroupMapping> 

</syncQueryMapping> 

的XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="1.0" targetNamespace="synchronisation" xmlns="synchronisation"> 

    <!-- JAXB Configuration --> 
    <xs:annotation> 
     <xs:appinfo> 
      <jaxb:schemaBindings> 
       <jaxb:package name="synchronisation.implementation" /> 
      </jaxb:schemaBindings> 
     </xs:appinfo> 
    </xs:annotation> 

    <xs:complexType name="dbSyncUserType" > 
     <xs:sequence> 
      <xs:element type="xs:string" name="tableName" /> 
      <xs:element type="xs:string" name="nameColumn" /> 
      <xs:element type="xs:string" name="passwordColumn" /> 
      <xs:element type="xs:string" name="suspendStartDateColumn" minOccurs="0" /> 
      <xs:element type="xs:string" name="suspendEndDateColumn" minOccurs="0" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="dbSyncGroupType"> 
     <xs:sequence> 
      <xs:element type="xs:string" name="tableName" /> 
      <xs:element type="xs:string" name="nameColumn" /> 
      <xs:element type="xs:string" name="typeColumn" minOccurs="0" /> 
      <xs:element type="typeColumnDataTypeType" name="typeColumnDataType" minOccurs="0" /> 
      <xs:element type="xs:string" name="typeValue" minOccurs="0" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:simpleType name="typeColumnDataTypeType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="INTEGER" /> 
      <xs:enumeration value="VARCHAR" /> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="dbSyncUserTableJoinType"> 
     <xs:sequence> 
      <xs:element type="xs:string" name="userKeyColumn" /> 
      <xs:element type="xs:string" name="mappingsForeignKeyColumn" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="dbSyncGroupTableJoinType"> 
     <xs:sequence> 
      <xs:element type="xs:string" name="groupKeyColumn" /> 
      <xs:element type="xs:string" name="mappingsForeignKeyColumn" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="dbSyncUserGroupMappingJoinType"> 
     <xs:sequence> 
      <xs:element type="dbSyncUserTableJoinType" name="userTable" /> 
      <xs:element type="dbSyncGroupTableJoinType" name="groupTable" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="dbSyncUserGroupMappingType"> 
     <xs:sequence> 
      <xs:element type="xs:string" name="tableName" /> 
      <xs:element type="xs:string" name="userNameColumn" /> 
      <xs:element type="xs:string" name="groupNameColumn" /> 
      <xs:element type="dbSyncUserGroupMappingJoinType" name="join" minOccurs="0" /> 
     </xs:sequence> 
    </xs:complexType> 

    <!-- Root element --> 
    <xs:element name="syncQueryMapping"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element type="dbSyncUserType" name="user" /> 
       <xs:element type="dbSyncGroupType" name="group" /> 
       <xs:element type="dbSyncUserGroupMappingType" name="userGroupMapping" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

回答

1

當您添加xmlns="synchronisation"到XML文檔要指定,如果沒有一個前綴的所有嵌套元素都屬於該命名空間(syncQueryMappinguser)。

<syncQueryMapping 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="synchronisation" 
    xsi:schemaLocation="synchronisation syncQueryMappingSchema.xsd"> 
    <user> 
     .... 

您需要在您的XML模式的根元素添加elementFormDefault="qualified"以表明對應於該XML模式的XML文檔中的所有元素命名空間限定。

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="1.0" 
    targetNamespace="synchronisation" 
    xmlns="synchronisation" 
    elementFormDefault="qualfied"> 

沒有指定爲了使XML文檔有效而只有全局元素應該是名稱空間滿足。這意味着你不能使用默認的命名空間。

+0

賓果。謝謝!那麼這是否聲明沒有命名空間的元素被這個模式限定爲默認?再次感謝! – TheBloodGuy

+0

@TheBloodGuy - 我已經更新了我的答案,希望這會讓它更清晰。 –

+1

Billiant,謝謝! – TheBloodGuy