Создать XML через DOM и провалидировать его
У меня есть xml документ:
<?xml version="1.0" encoding="UTF-8"?>
<transports transportid="1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="transport.xsd">
<transport>
<marka>Mersedes</marka>
<weight>100</weight>
<gos_number>k500u</gos_number>
</transport>
<firstname>Mikhail</firstname>
<surname>Semenov</surname>
</transports>
И xsd схема к нему для проверки на валидность:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="transports">
<xs:complexType>
<xs:sequence>
<xs:element name="transport">
<xs:complexType>
<xs:sequence>
<xs:element name="marka" type="xs:string"/>
<xs:element name="weight" type="xs:string"/>
<xs:element name="gos_number" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="surname" type="xs:string"/>
</xs:sequence>
<xs:attribute name="transportidid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Мне необходимо через java DOM создать точно такой же xml документ и программно провалидировать его. Подскажите как правильно сделать, я в этом новичок поэтому не знаю как правильно написать код для решения такой задачи. Все откликнувшимся заранее спасибо.
Нашел решение здесь ссылка 1
Но здесь работа с простыми типами данных, а у меня тег transport сложный тип.
По валидации нашел решение здесьссылка 2
но в листинге 1 на строке 25, такая строчка кода Source source = new StreamSource(args[0]); я не понимаю что за тип данных Source и что-нужно сделать чтобы передать ему именно уже готовый файл xml.
Ответы (1 шт):
Для формирования XML-файла из java кода полезная информация тут: https://stackoverflow.com/questions/11463231/how-to-generate-jaxb-classes-from-xsd
Для валидации использовал библиотеку xmlunit
<dependency>
<groupId>org.xmlunit</groupId>
<artifactId>xmlunit-core</artifactId>
<version>2.2.1</version>
</dependency>
private boolean validateXmlAgainstXsd(InputStream xmlFileStream) {
String xsdSchema = new String(Files.readAllBytes(Paths.get(XSD_FILE_NAME_URI)));
Validator validator = Validator.forLanguage(Languages.W3C_XML_SCHEMA_NS_URI);
validator.setSchemaSource(Input.fromString(xsdSchema).build());
ValidationResult r = validator.validateInstance(Input.fromStream(xmlFileStream).build());
if(r.getProblems().isEmpty()) {
return true;
}
Iterator<ValidationProblem> probs = r.getProblems().iterator();
while (probs.hasNext()) {
LOG.error(probs.next().toString());
}
return false;
}