XSD验证错误:找不到元素'xs:schema'的声明

问题描述:

我看到这个问题被问了很多次,但我没有找到解决我的问题的方法。因此,错误的是:XSD验证错误:找不到元素'xs:schema'的声明

Error on line 2 of document file...doc.xsd: cvc-elt.1: Cannot find the declaration of element 'xs:schema'

XSD文件代码:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="Collection" > 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Description" type="xs:string"/> 
     <xs:element name="Recipe" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="Title" type="xs:string"/> 
        <xs:element name="Ingredients"> 
         <xs:complexType> 
          <xs:element name="Ingredient" minOccurs="0" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:attribute name="name" type="xs:string" use="required"/> 
            <xs:attribute name="amount" type="xs:integer" use="required"/> 
            <xs:attribute name="unit" type="xs:string" use="required"/> 
           </xs:complexType> 
          </xs:element> 
         </xs:complexType> 
        </xs:element> 
        <xs:element name="Preparation"> 
         <xs:complexType> 
          <xs:element name="Step" type="xs:string minOccurs="0" maxOccurs="unbounded"/>" 
         </xs:complexType> 
        </xs:element> 
        <xs:element name="Comment" type="xs:string" minOccurs="0"/> 
        <xs:element name="Nutrients"> 
         <xs:complexType> 
          <xs:attribute name="proteins" type="xs:integer" use="required"/> 
          <xs:attribute name="carbohidrati" type="xs:NMTOKEN" use="required"/> 
          <xs:attribute name="fat" type="xs:integer" use="choice"/> 
          <xs:attribute name="vitamins" type="xs:NMTOKEN" use="required"/> 
          <xs:attribute name="calories" type="xs:float" use="required"/> 
         </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

XML文件中的代码:

<?xml version="1.0" encoding="UTF-8"?> 

<Collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="src/doc.xsd"> 
<Description>Nu prea merge</Description> 
<Recipe> 
<Title>Paste</Title> 
<Ingredients> 
    <Ingredient name="paste" amount="1" unit="pachet"></Ingredient> 
</Ingredients> 
<Preparation> 
    <Step>Fierbere</Step> 
    <Step>Servire</Step> 
</Preparation> 
<Nutrients proteins="2" carbohidrati="2" fat="da" vitamins="4" calories="1000.9"></Nutrients> 
</Recipe> 
</Collection> 

的Java代码等级:

import java.io.File; 
import java.io.IOException; 

import org.jdom2.Document; 
import org.jdom2.JDOMException; 
import org.jdom2.input.SAXBuilder; 
import org.jdom2.input.sax.XMLReaders; 
import org.jdom2.output.Format; 
import org.jdom2.output.XMLOutputter; 


public class Main { 
    public static void main(String[] args) { 
     File newFile = new File("src/doc.xsd"); 
     Document doc = null; 

     SAXBuilder sbd = new SAXBuilder(XMLReaders.XSDVALIDATING); 

     try { 

      doc = sbd.build(newFile); 
     } catch (JDOMException | IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     XMLOutputter outputDoc = new XMLOutputter(); 
     outputDoc.setFormat(Format.getPrettyFormat()); 
     try{ 
      outputDoc.output(doc,System.out); 
      //outputDoc.output(doc, new FileWriter("src/myXmlDoc2.xml")); 
     } 
     catch(Exception e){ 
      System.out.println("Eroare la parsarea documentului XML!"); 
     } 
} 

} 

如果有人对可能出现的问题有任何意见,请帮助我!

+0

您在XSD中有一个错字。 – Andreas

+0

我已经改正了错字,但那不是问题... – sixfeet

+0

还有其他几个问题,很快就会完成答案... – kjhughes

假设你的XML是固定的,那么你应该改变你的XSD如下:

  1. 修复额外"由@Andreas提及。
  2. xs:sequence分为xs:complexType两处。
  3. @fat的类型更改为xs:string
  4. 更改use="choice"use="optional"

总之,这将XSD成功验证XML:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Collection" > 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Description" type="xs:string"/> 
     <xs:element name="Recipe" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Title" type="xs:string"/> 
       <xs:element name="Ingredients"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="Ingredient" minOccurs="0" maxOccurs="unbounded"> 
         <xs:complexType> 
         <xs:attribute name="name" type="xs:string" use="required"/> 
         <xs:attribute name="amount" type="xs:integer" use="required"/> 
         <xs:attribute name="unit" type="xs:string" use="required"/> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
       <xs:element name="Preparation"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="Step" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
       <xs:element name="Comment" type="xs:string" minOccurs="0"/> 
       <xs:element name="Nutrients"> 
       <xs:complexType> 
        <xs:attribute name="proteins" type="xs:integer" use="required"/> 
        <xs:attribute name="carbohidrati" type="xs:NMTOKEN" use="required"/> 
        <xs:attribute name="fat" type="xs:string" use="optional"/> 
        <xs:attribute name="vitamins" type="xs:NMTOKEN" use="required"/> 
        <xs:attribute name="calories" type="xs:float" use="required"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

当然,你还必须检查你的Java代码。 (提示:确保当你真的想验证XML与XSD的对比时,确认你没有将XSD验证为XML。)

+0

@sixfeet请注意,绝大多数如果你使用了一个好的XML编辑器或者一个好的IDE(比如Eclipse),XSD中的这些错误就会立即被发现,只需将XSD粘贴到Eclipse中即可显示所有错误(除了错误类型的“@ fat”) – Andreas

+0

@ Andreas:我已经使用Eclipse Luna,但没有错误信号 – sixfeet