无法根据 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"格式是最容易使用的格式。
我是新手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"格式是最容易使用的格式。