Я пытаюсь проверить XML на нескольких XSD, и я придумал этот код. Но проблема в том, что когда я использую отладчик в методе validateXML
для проверки объекта схемы, я вижу только один файл в fGrammarDescription, который всегда является первым файлом в имени схемы.
Итак, наконец, теги из другие xsd не распознаются и, следовательно, не проходят проверку.
public class TestMain {
public static void main(String[] args) {
TestMain testMain = new TestMain();
String schemaName1 = "1.xsd";
String schemaName2 = "2.xsd";
String schemaName3 = "3.xsd";
String schemaName4 = "4.xsd";
String schemaName5 = "5.xsd";
String xmlName = "C:\\Users\\nagesingh\\IdeaProjects\\test.xml";
Schema schema = testMain.loadSchema(schemaName1, schemaName2, schemaName3,schemaName4,schemaName5);
Document document = parseXmlDom(xmlName);
validateXml(schema, document);
}
public static void validateXml(Schema schema, Document document) {
try {
// 3. Get a validator from the schema.
Validator validator = schema.newValidator();
System.out.println("Validator Class: " + validator.getClass().getName());
// validating the document against the schema
validator.validate(new DOMSource(document));
System.out.println("Validation passed.");
} catch (Exception e) {
// catching all validation exceptions
System.out.println(e.toString());
}
}
public Schema loadSchema(String... schemaFileName) {
Schema schema = null;
try {
String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
SchemaFactory factory = SchemaFactory.newInstance(language);
List<Source> sourceList = new ArrayList<>();
List<String> stringList = Arrays.asList(schemaFileName);
for (String eachSchemaFile : stringList){
sourceList.add(new StreamSource(getClass().getClassLoader().getResource("xml/"+eachSchemaFile).toExternalForm()));
}
schema = factory.newSchema(sourceList.stream().toArray(Source[]::new));
} catch (Exception e) {
System.out.println(e.toString());
}
return schema;
}
public static Document parseXmlDom(String xmlName) {
Document document = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(new File(xmlName));
} catch (Exception e) {
System.out.println(e.toString());
}
return document;
}
}