2012-04-18 88 views
0

我有下面的XML文件:XML驗證:CVC-elt.1:找不到元素的聲明 'XXX'

<?xml version="1.0"?> 
<!DOCTYPE library SYSTEM "library.dtd"> 
<library 
xmlns="http://example.com/a" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://example.com library.xsd" 
name=".NET Developer's Library"> 
<book> 
<category>computerss</category> 
<title>Programming Microsoft .NET</title> 
<author>Jeff Prosise</author> 
<isbn>0-7356-1376-1</isbn> 
</book> 
<book> 
<category>computer</category> 
<title>Microsoft .NET for Programmers</title> 
<author>Fergal Grimes</author> 
<isbn>1-930110-19-7</isbn> 
</book> 
</library> 

而且Java代碼:

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 
docBuilderFactory.setSchema(sf.newSchema(new File("library.xsd"))); 
docBuilderFactory.setNamespaceAware(true); 
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
docBuilder.parse(new FileInputStream("data.xml")); 

它產生以下錯誤:

[Error] :7:33: cvc-elt.1: Cannot find the declaration of element 'library'.

如果我刪除在X XSD聲明ML文件一切工作正常...

任何內部高度讚賞。謝謝。

這裏是架構:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="library"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="book" maxOccurs="unbounded"/> 
      </xs:sequence> 
      <xs:attribute name="name" type="xs:string" use="optional"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="book"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="category"/> 
       <xs:element ref="title"/> 
       <xs:element ref="author"/> 
       <xs:element ref="isbn"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="category"> 
    <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="computer" /> 
      <xs:enumeration value="poetry" /> 
     </xs:restriction> 
    </xs:simpleType> 
    </xs:element> 
    <xs:element name="title" type="xs:string"/> 
    <xs:element name="author" type="xs:string"/> 
    <xs:element name="isbn" type="xs:string"/> 
</xs:schema> 
+0

請發表您的架構以及 – maximdim 2012-04-18 14:16:10

+0

完成。感謝您的關注。 – 2012-04-18 14:18:06

+0

這個例子可能會有幫助:http://java-by-ash.blogspot.com/2012/07/xml-schema-validation.html – ThreaT 2012-07-20 11:14:52

回答

2

您的XML具有命名空間的引用(的xmlns =「http://example.com/a」),這是不一樣的架構。您是否嘗試過在任何XML編輯器(例如Altova或Eclipse等)中針對模式驗證您的XML。

到目前爲止,它看起來像您的解析錯誤是合法的,XML根據架構無效。

+0

我應該如何在XSD文件中包含名稱空間? – 2012-04-18 14:26:43

+0

通常,模式定義如下所示: maximdim 2012-04-18 14:37:31

+0

注意'targetNamespace' – maximdim 2012-04-18 14:38:35

0

您的架構定義不正確。正如maximdim所說,一開始,您的架構在架構標記中沒有targetNamespace="http://mysite.com/a"屬性。

其次您的架構看起來好像它應該只有一個根元素,你有6

爲XML實例的正確的模式應該是:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://mysite.com/a" targetNamespace="http://mysite.com/a"> 

    <xs:element name="library"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="book" type="book" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="book"> 
    <xs:sequence> 
     <xs:element name="category"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
      <xs:enumeration value="computer" /> 
      <xs:enumeration value="poetry" /> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
     <xs:element name="title" type="xs:string"/> 
     <xs:element name="author" type="xs:string"/> 
     <xs:element name="isbn" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 

</xs:schema> 
+0

關於單根元素的好處:) – maximdim 2012-04-18 14:47:35

+0

這我不明白「其次,模式只能有一個根元素,你有6個。」 – 2012-04-18 14:59:51

+0

好吧,我的意思是說,從你的實例文檔中可以清楚地看到你有一個名爲「library」的根元素,它包含一個或多個「book」複雜類型。您的模式定義將書籍定義爲根節點,而不是複雜類型。 – 2012-04-18 15:11:34

相關問題