使用 xml 验证和 xsd 模式的问题
Problems using xml validation with xsd schema
这是我第一次使用 xsd 来验证 java 中的 xml 文档,我似乎真的无法让它工作。
嗯,首先是我的 xml 文档结构,Employees.xml:
<?xml version="1.0"?>
<x:Employees xmlns:x="urn:Employees">
<Employee id="1">
<name>Some Guy</name>
<gender>Male</gender>
<role>Java Developer</role>
</Employee>
<Employee id="2">
<name>Some lady</name>
<gender>Female</gender>
<role>CEO</role>
</Employee>
</x:Employees>
这是我的 xsd 文件结构,EmployeesXmlSchema.xsd:
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:x="urn:Employees" targetNamespace="urn:Employees">
<xsd:element name="Employees" type="x:Employees"/>
<xsd:complexType name="Employees">
<xsd:sequence>
<xsd:element name="Employee" type="x:Employee" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Employee">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="gender" type="xsd:string"/>
<xsd:element name="role" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
这里是 java 代码,试图验证 xml 文档:
try {
String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
SchemaFactory factory = SchemaFactory.newInstance(language);
schema = factory.newSchema(schemaFile);
// Parse the XML document to DOM Document, and then validate it
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
DOMSource source = new DOMSource(doc);
Validator validator = schema.newValidator();
validator.validate(source);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
我得到的错误是 SAXParseException 并说:
Invalid content was found starting with element 'Employee'. One of
'{"urn:Employees":Employee}' is expected.
我真的希望有人能向我解释为什么会出错。
任何帮助将不胜感激
首先,您应该更正您的XML:
<Employees xmlns="urn:Employees" id="1">
<name>Some Guy</name>
<gender>Male</gender>
<role>Java Developer</role>
</Employees>
或更正您的 XSD:
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:x="urn:Employees" targetNamespace="urn:Employees">
<xsd:element name="Employees" type="x:Employees"/>
<xsd:complexType name="Employees">
<xsd:sequence>
<xsd:element name="Employee" type="x:Employee" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Employee">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="gender" type="xsd:string"/>
<xsd:element name="role" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
其次,您应该启用对 XML 命名空间的支持:
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
这是我第一次使用 xsd 来验证 java 中的 xml 文档,我似乎真的无法让它工作。
嗯,首先是我的 xml 文档结构,Employees.xml:
<?xml version="1.0"?>
<x:Employees xmlns:x="urn:Employees">
<Employee id="1">
<name>Some Guy</name>
<gender>Male</gender>
<role>Java Developer</role>
</Employee>
<Employee id="2">
<name>Some lady</name>
<gender>Female</gender>
<role>CEO</role>
</Employee>
</x:Employees>
这是我的 xsd 文件结构,EmployeesXmlSchema.xsd:
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:x="urn:Employees" targetNamespace="urn:Employees">
<xsd:element name="Employees" type="x:Employees"/>
<xsd:complexType name="Employees">
<xsd:sequence>
<xsd:element name="Employee" type="x:Employee" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Employee">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="gender" type="xsd:string"/>
<xsd:element name="role" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
这里是 java 代码,试图验证 xml 文档:
try {
String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
SchemaFactory factory = SchemaFactory.newInstance(language);
schema = factory.newSchema(schemaFile);
// Parse the XML document to DOM Document, and then validate it
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
DOMSource source = new DOMSource(doc);
Validator validator = schema.newValidator();
validator.validate(source);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
我得到的错误是 SAXParseException 并说:
Invalid content was found starting with element 'Employee'. One of '{"urn:Employees":Employee}' is expected.
我真的希望有人能向我解释为什么会出错。
任何帮助将不胜感激
首先,您应该更正您的XML:
<Employees xmlns="urn:Employees" id="1">
<name>Some Guy</name>
<gender>Male</gender>
<role>Java Developer</role>
</Employees>
或更正您的 XSD:
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:x="urn:Employees" targetNamespace="urn:Employees">
<xsd:element name="Employees" type="x:Employees"/>
<xsd:complexType name="Employees">
<xsd:sequence>
<xsd:element name="Employee" type="x:Employee" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Employee">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="gender" type="xsd:string"/>
<xsd:element name="role" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
其次,您应该启用对 XML 命名空间的支持:
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);