Помните, что значение по умолчанию для maxOccurs равно 1. Вы допускаете минимум 2 и максимум 1 ...
Попробуйте <xsd:sequence minOccurs="2" maxOccurs="unbounded">
Редактировать: осторожно с 'неограниченным', хотя; вы бы хотели установить его на приемлемый максимум, не давая никому возможности обстрелять вашу систему с помощью миллиарда узлов.
Edit2: , при условии, что xsd (исправленный с maxOccurs) и xml выше, этот код выведет «Проверка не удалась !!!» :
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
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;
import org.xml.sax.SAXParseException;
public class XMLValidate {
static File xsd;
static File xml;
static URL url;
static StreamSource source;
static SchemaFactory schemaFactory;
static Schema schema;
static Validator validator;
/**
* @param args
*/
public static void main(String[] args) {
xml = new File("example.xml");
xsd = new File("Live.xsd");
try {
url = new URL(xsd.toURI().toString());// xsd
} catch (MalformedURLException e) {
e.printStackTrace();
}
source = new StreamSource(xml); // xml
try {
//System.out.println(url);
schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schema = schemaFactory.newSchema(url);
} catch (SAXException e) {
e.printStackTrace();
}
validator = schema.newValidator();
//System.out.println(xml);
try {
validator.validate(source);
System.out.println("Validation succesful!");
} catch (SAXParseException e) {
System.out.println("Validation failed!!!");
//e.printStackTrace(); -- uncomment for detailed info on validation failing
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Если вы измените код для проверки следующего example2.xml , он выдаст «Проверка успешна!» :
<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<player id="1">
<name>Owen</name>
<address>
<houseno>10</houseno>
<street>downing hill</street>
</address>
<name>Maggy</name>
<address>
<houseno>10</houseno>
<street>downing hill</street>
</address>
</player>
</Test>
Ваш xsd с minOccurs = 2 заставляет вас дважды иметь имя-адрес последовательности в xml. Не уверен, что это то, что вы искали в первую очередь; это кажется мне странным, но я не понимаю требований.