2011-09-27 34 views
1

我無法通過代碼驗證使用XSD的XML。我想不出什麼我失蹤 XML:無法針對xsd驗證xml。錯誤「cvc-elt.1:找不到元素'系統'的聲明」

<?xml version="1.0" encoding="UTF-8"?> 
<systems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns="test.namespace"> 
    <system address="test" id="test" name="test" systemNr="test"> 
    <mandant mandant="test"/> 
    </system> 
    <system address="test2" name="test2" systemNr="test2" id="test2"> 
    <mandant mandant="test2"/> 
    <mandant mandant="test2"/> 
    </system> 
    <system id="test3" address="test3" name="test3" systemNr="test3"> 
    <mandant mandant="test"/> 
    </system> 
</systems> 

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="test.namespace"> 
    <xs:element name="systems"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="system" maxOccurs="unbounded" minOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="mandant" 
       maxOccurs="unbounded" minOccurs="1"> 
       <xs:complexType> 
        <xs:attribute name="mandant" 
        type="xs:string" use="required"> 
        </xs:attribute> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="id" type="xs:string" use="required"> 
      </xs:attribute> 
      <xs:attribute name="name" type="xs:string" use="required"> 
      </xs:attribute> 
      <xs:attribute name="address" type="xs:string" use="required"> 
      </xs:attribute> 
      <xs:attribute name="systemNr" 
       type="xs:string" use="required"> 
      </xs:attribute> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

這裏是代碼片段:

 File systemsFile = new File(LocalFileSystemManager.getDefaultPath() + "Systems.xml"); 
     File schemaFile = new File(LocalFileSystemManager.getDefaultPath() + "SystemsSchema.xsd"); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document systemsDocument = db.parse(systemsFile); 
     systemsDocument.getDocumentElement().normalize(); 
SchemaFactory factory = SchemaFactory 
     .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = factory.newSchema(schemaFile); 
     Validator validator = schema.newValidator(); 
     validator.validate(new DOMSource(systemsDocument)); 

提前感謝! Lori

+0

可能與命名空間有關嗎? –

+0

抱歉,看起來我沒有從XSD Document中複製架構定義標記。它是:<?xml version =「1.0」encoding =「UTF-8」?> Lori

回答

1

這個實例應該被驗證。你的屬性屬於該模式,所以你需要將它們標記爲這樣一個命名空間:

<?xml version="1.0" encoding="UTF-8"?> 
<systems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="test.namespace"> 
    <system a:address="test" a:id="test" a:name="test" a:systemNr="test" xmlns:a="test.namespace"> 
     <mandant a:mandant="test"/> 
    </system> 
    ... 
</systems> 

我假設你有attributeFormDefault="qualified"elementFormDefault="qualified"<schema />元素?

+0

試過了,不起作用。我認爲它與系統標記有關,因爲我的錯誤是「cvc-elt.1:找不到元素'系統'的聲明」。我的schema元素中有elementFormDefault =「qualified」。我已經發布了與這個元素上面的評論,出於某種原因,它沒有在我的帖子apear。 – Lori

+0

修復了這個問題。你的實例是完全有效的,所以我的問題必須在你的代碼中。 –

+1

你是對的問題是在validator.validate(新的DOMSource(systemsDocument));與validator.validate(新的StreamSource(systemsFile));有用。太感謝了。 – Lori

相關問題