2015-05-29 3 views
0

Это первый раз, когда я использую xsd для проверки XML-документа в java, и я действительно не могу заставить его работать.Проблемы с использованием проверки xml с помощью схемы xsd

Ну, прежде всего, вот мой 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 d говорит:

Неверный контент был найден, начиная с элемента «Сотрудник». Ожидается одно из '{"urn: Employees}: Employee}'.

Я действительно надеюсь, что кто-то может объяснить мне, почему это происходит не так.

Любая помощь будет grreatly оценена

ответ

0

Во-первых, вы должны исправить 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); 
+0

Благодарим вас за ответ. Однако я получаю еще одну ошибку. Я обновил свой код и сообщение об ошибке в вопросе. Надеюсь, ты поможешь мне. – Langkiller

+0

Не обращайте внимания @Alex. Я нашел этот сайт для генерации xsd из xml и напротив: http://xmlgrid.net/xml2xsd.html. Я все равно соглашусь на ваш ответ, так как это помогло мне по-прежнему. Спасибо :) – Langkiller

+0

Добро пожаловать. –

Смежные вопросы