无法根据 xsd 验证 xml

unable to validate xml against xsd

我是新手XSD。我编写了一个 XSD 文件和 XML 文件以及一个程序来根据 XSD 验证 XML。当我 运行 程序时,我收到错误 Invalid content was found starting with element 'id'. One of '{id}' is expected。谁能解释一下我哪里出错了。

XSD 文件:

<?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                targetNamespace="http://www.edureka.co/Student" 
                xmlns:st="http://www.edureka.co/Student"
                >
        <xs:element name="student"  type="st:student"></xs:element>
            <xs:complexType name="student">
                <xs:sequence>
                    <xs:element name="id" type="xs:int"/>
                    <xs:element name="name" type="xs:string"/>
                    <xs:element name="language" type="xs:string"/>
                    <xs:element name="expertise" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>

和 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
    <student xmlns="http://www.edureka.co/Student"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.edureka.co/Student studentRule.xsd"
             >

       <id>1234</id>
       <name>Pradeep</name>
       <language>Sanskrit</language>
       <expertise>Beginner</expertise>
    </student>

用于验证 XML 文件的 Java 程序:

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

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

public class ValidatorDemo {

    public static void main(String[] args) {

      System.out.println("student.xml validates against studentRule.xsd? "+validateXMLSchema("studentRule.xsd", "student.xml"));

      }

    public static boolean validateXMLSchema(String xsdPath, String xmlPath){

        try {
            SchemaFactory factory = 
                    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = factory.newSchema(new File(xsdPath));
            Validator validator = schema.newValidator();
            validator.validate(new StreamSource(new File(xmlPath)));
        } catch (IOException | SAXException e) {
            System.out.println("Exception: "+e.getMessage());
            return false;
        }
        return true;
    }
}

将属性 elementFormDefault="qualified" 添加到架构的根元素。

默认为"unqualified",指定默认命名空间时不能使用。

或者,您可以保留您的架构,并更新您的文档以使用非限定格式(没有默认名称空间,并且只限定全局元素):

<st:student xmlns:st="http://www.edureka.co/Student"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.edureka.co/Student studentRule.xsd"
        >

    <id>1234</id>
    <name>Pradeep</name>
    <language>Sanskrit</language>
    <expertise>Beginner</expertise>
</st:student>

您发布的xml文档是"qualified"格式;每个元素都明确地与一个命名空间相关联,您可以通过指定默认值 - xmlns="http://www.edureka.co/Student" 来实现这一点。

上面的xml是"unqualified"的格式;全局元素(即模式中的顶级元素)必须是限定的,但局部元素(即模式中的嵌套元素)必须是非限定的。在 "unqualified" 格式中,局部元素与封闭的全局元素的名称空间隐式关联。

不能在使用 "unqualified" 的文档中使用默认命名空间,因为它明确地将没有命名空间前缀的元素与命名空间相关联。将其视为将 "the empty prefix" 与命名空间相关联。

一般来说,"qualified"格式是最容易使用的格式。