- Java xml xsd пример
- 17.1 Introduction to XML Validation
- 17.1.1 Prerequisites for Using the XML Schema Processor for Java
- 17.1.2 Standards and Specifications for the XML Schema Processor for Java
- 17.1.3 XML Validation with DTDs
- Валидация XML с помощью XSD, JAXB и Spring Framework
- 1. Исходные файлы и схемы
- 2. Конфигурация Spring
- 3. Преобразование XML-Java
- 4. Демонстрация работы программы
Java xml xsd пример
Topics here cover how to use the Extensible Markup Language (XML) schema processor for Java.
17.1 Introduction to XML Validation
Topics cover the different techniques for XML validation.
17.1.1 Prerequisites for Using the XML Schema Processor for Java
Prerequisites for using the XML schema processor are covered.
This section assumes that you have working knowledge of these technologies:
- document type definition (DTD) . An XML document type definition (DTD) defines the legal structure of an XML document.
- XML Schema language . XML Schema defines the legal structure of an XML document.
To learn more about these technologies, consult the XML resources in Related Documents.
17.1.2 Standards and Specifications for the XML Schema Processor for Java
XML Schema is a World Wide Web Consortium (W3C) standard.
The Oracle XML Schema processor supports the W3C XML Schema specifications:
Related Topics
17.1.3 XML Validation with DTDs
Document type definition (DTDs) were originally developed for SGML. XML DTDs are a subset of those available in SGML and provide a mechanism for declaring constraints on XML markup. XML DTDs enable the specification of:
- Which elements can be in your XML documents.
- The content model of an XML element, that is, whether the element contains only data or has a set of subelements that defines its structure. DTDs can define whether a subelement is optional or mandatory and whether it can occur only once or multiple times.
- Attributes of XML elements. DTDs can also specify whether attributes are optional or mandatory.
- Entities that are legal in your XML documents.
An XML DTD is not itself written in XML, but is a context-independent grammar for defining the structure of an XML document. You can declare a DTD in an XML document itself or in a separate file from the XML document.
Validation is the process by which you verify an XML document against its associated DTD, ensuring that the structure, use of elements, and use of attributes are consistent with the definitions in the DTD. Thus, applications that handle XML documents can assume that the data matches the definition.
Using XDK, you can write an application that includes a validating XML parser; that is, a program that parses and validates XML documents against a DTD. Depending on its implementation, a validating parser may:
- Either stop processing when it encounters an error, or continue.
- Either report warnings and errors as they occur or in summary form at the end of processing.
- Enable or disable validation mode Most processors can enable or disable validation mode, but they must still process entity definitions and other constructs of DTDs.
17.1.3.1 DTD Samples in XDK
An example DTD is shown, together with an example XML document that conforms to that DTD.
Example 17-1 shows the contents of a DTD named family.dtd , which is located in $ORACLE_HOME/xdk/demo/java/parser/common/ . The tags specify the legal nomenclature and structure of elements in the document, whereas the tags specify the legal attributes of elements.
Example 17-2 shows the contents of an XML document named family.xml , which is also located in $ORACLE_HOME/xdk/demo/java/parser/common/ . The element in family.xml specifies that this XML document conforms to the external DTD named family.dtd .
Валидация XML с помощью XSD, JAXB и Spring Framework
Здравствуйте! В этой статье я хочу описать программу валидации XML с помощью Spring Framework. Наиболее очевидная область применения такой валидации — это программирование web-сервисов.
Валидация производится через преобразование XML-Java (unmarshalling) по соответствующей XSD-схеме. XML-файл считается прошедшим проверку, если преобразование XML в объект Java прошло успешно.
Проект компилируется в jar файл и запускается в командной строке. Для красоты прикручен Apache ANSI Printer, в котором можно задавать шрифт, цвет и выделение текста в cmd.
Исходный код доступен в GitHub по ссылке XmlProcessor.
1. Исходные файлы и схемы
В качестве входных данных определим 2 XML файла Address.xml и Client.xml.
V001.000.00 50 7 Sadovaya SPB Russia 123456
Далее определим XSD-схемы XmlValidator.xsd, ComplexTypes.xsd и SimpleTypes.xsd с
описанием контейнера CombinedType и объектов типа Address и Client:
XSD structure XML definition
The version Address type Client type Apartment number House number Street name City name Country name Postal index The id The name
V000.000.00 .2.2"/> Int, 10 max String, 50 max Int, 4 max Int, 3 max String, 40 max City, 40 max Country, 30 max Int, 10 max
Обратите внимание на элемент в CombinedType схемы ComplexTypes.xsd. Он означает, что xml-файл должен содержать либо один элемент типа Address, либо один или несколько элементов типа Client.
2. Конфигурация Spring
В файле spring-config.xml находится описание используемых в проекте бинов Printer,
FileReader, Marshaller, XMLService. Помимо указанных бинов, определен фильтр расширений
FileNameExtensionFilter, чтобы рассматривать только xml-файлы.
xml
com.xmlprocessor.types.CombinedType
xmlvalidator.xsd complextypes.xsd simpletypes.xsd
3. Преобразование XML-Java
В точке входа приложения XmlProcessorDrv сначала считываем и проверяем аргументы
командной строки, затем через вызов методов класса Compositor создаем бины printer,
fileReader и xmlService. Далее считываем xml-файлы и выполняем валидацию файлов в
директории, указанной в CLI_OPTION_DIRECTORY.
Самое интересное происходит при вызове
xmlService.validate(xmlFiles)
package com.xmlprocessor.main; import java.io.File; import java.util.List; import com.xmlprocessor.config.Compositor; import com.xmlprocessor.service.api.PrinterInt; import com.xmlprocessor.service.api.XmlServiceInt; import com.xmlprocessor.util.CommandLineArgs; public class XmlProcessorDrv < /** Name of the program */ private static final String PROG_NAME = XmlProcessorDrv.class.getSimpleName(); /** Version of the Program */ private static final String PROG_VERSION = "1.0 (XmlProcessor v1.000)"; /** Exit Status for OK. */ private static final int EXIT_STATUS_OK = 0; /** Exit Status for not OK. */ private static final int EXIT_STATUS_NOT_OK = -1; /** * Main entry point. * Evaluates command line args and validates provided xml files * * @param args * Command line arguments */ public static void main(String[] args) < // execution status int exitStatus; // get printer object PrinterInt printer = Compositor.getPrinter(); // read command line args CommandLineArgs cmdLineArgs = new CommandLineArgs(args); // Show version if (cmdLineArgs.hasOption(CommandLineArgs.CLI_OPTION_VERSION)) < printer.printf("%s v%s\n", PROG_NAME, PROG_VERSION); >// Show help if (cmdLineArgs.hasOption(CommandLineArgs.CLI_OPTION_HELP)) < cmdLineArgs.printHelp(PROG_NAME); >// Check if the directory name is passed in args if (!cmdLineArgs.hasOption(CommandLineArgs.CLI_OPTION_DIRECTORY)) < cmdLineArgs.printHelp(PROG_NAME); return; >String dir = cmdLineArgs.getOptionValue(CommandLineArgs.CLI_OPTION_DIRECTORY); printer.printf("\n%s %s","Folder with XML files: ", dir); List xmlFiles; XmlServiceInt xmlService = Compositor.getXmlService(); try < xmlFiles = Compositor.getFileReader().readFiles(dir); printer.bold("\n\nStart validating XML files:\n"); xmlService.validate(xmlFiles); exitStatus = EXIT_STATUS_OK; >catch (Exception ex) < printer.errorln("\n" + ex.getMessage()); exitStatus = EXIT_STATUS_NOT_OK; >System.exit(exitStatus); > // main >
Код метода validate представлен ниже.
. /** */ public void validate(List xmlFiles) throws Exception < int fileCount = xmlFiles.size(); File currentFile; FileInputStream fileInputStream = null; Source xmlFileSource; CombinedType combinedType; AddressType addressType; for (int count = 0; count < fileCount; count++) < currentFile = xmlFiles.get(count); printer.boldln("Current file: ").println(currentFile.getPath()); try < fileInputStream = new FileInputStream(currentFile); xmlSource = new StreamSource(fileInputStream); combinedType = (CombinedType)unmarshaller.unmarshal(xmlSource); printer.boldln("Xml file [" + currentFile.getName() + "] validation success!\n"); printer.boldln("Version: ").println(combinedType.getVersion()); addressType = combinedType.getAddress(); if (addressType != null) < printer.boldln("Address: ").println(addressType.toString()); >else if (combinedType.getClients() != null) < int i=0; for (ClientType client : combinedType.getClients()) < printer.boldln("Client").println("[" + ++i + "]" + client.toString()); >> > catch(Exception e) < printer.fatalln("Xml file [" + currentFile.getName() + "] validation error: \n" + e.getMessage()); >finally < if (fileInputStream != null) < fileInputStream.close(); >> > printer.boldln("Validating complete."); >
Ключевое преобразование XML-Java или unmarshalling происходит в строке
combinedType = (CombinedType)unmarshaller.unmarshal(xmlSource);
Как уже упоминалось, если удалось из XML получить java-объект типа CombinedType, то
XML признается корректным.
Unmarshaller-у должен быть заранее известен конечный объект преобразования. Для
этого с помощью JAXB создадим файлы AddressType.java, ClientType.java, CombinedType.java
В IDE Eclipse: правый клик по XSD -> Generate -> JAXB Classes…
package com.xmlprocessor.types; import java.math.BigInteger; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; /** * Java class for AddressType complex type.
*/ @SuppressWarnings("restriction") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "AddressType", propOrder = < "apartment", "street", "house", "city", "country", "index" >) public class AddressType < @XmlElement(name = "Apartment", required = true) protected Integer apartment; @XmlElement(name = "House", required = true) protected BigInteger house; @XmlElement(name = "Street", required = true) protected String street; @XmlElement(name = "City", required = true) protected String city; @XmlElement(name = "Country", required = true) protected String country; @XmlElement(name = "Index") protected BigInteger index; public Integer getApartment() < return apartment; >public void setApartment(Integer value) < this.apartment = value; >public String getStreet() < return street; >public void setStreet(String value) < this.street = value; >public BigInteger getHouse() < return house; >public void setHouse(BigInteger value) < this.house = value; >public String getCity() < return city; >public void setCity(String value) < this.city = value; >public String getCountry() < return country; >public void setCountry(String value) < this.country = value; >public BigInteger getIndex() < return index; >public void setIndex(BigInteger value) < this.index = value; >public boolean isSetIndex() < return (this.index!= null); >@Override public String toString() < StringBuilder sb = new StringBuilder(); sb.append("\nApartment#: " + apartment); sb.append("\nHouse#: " + house); sb.append("\nStreet: " + street); sb.append("\nCity: " + city); sb.append("\nCountry: " + country); if (this.isSetIndex()) < sb.append("\nIndex: " + index); >return sb.toString(); > >
package com.xmlprocessor.types; import java.math.BigInteger; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; @SuppressWarnings("restriction") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "ClientType", namespace = "http://www.tempuri.org/complextypes", propOrder = < "id", "name" >) public class ClientType < @XmlElement(name = "Id", required = true) protected BigInteger id; @XmlElement(name = "Name", required = true) protected String name; public BigInteger getId() < return id; >public void setId(BigInteger value) < this.id = value; >public String getName() < return name; >public void setName(String value) < this.name = value; >@Override public String toString() < StringBuilder sb = new StringBuilder(); sb.append("\nId: " + id); sb.append("\nName: " + name); return sb.toString(); >>
package com.xmlprocessor.types; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * Java class for CombinedType complex type. */ @SuppressWarnings("restriction") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "CombinedType", propOrder = < "version", "clients", "address" >) @XmlRootElement(name = "Combined", namespace = "http://www.tempuri.org/types") public class CombinedType < @XmlElement(name = "Version", required = true) protected String version; @XmlElement(name = "Client") protected Listclients; @XmlElement(name = "Address") protected AddressType address; public String getVersion() < return version; >public void setVersion(String value) < this.version = value; >public List getClients() < if (clients == null) < clients = new ArrayList(); > return this.clients; > public AddressType getAddress() < return address; >public void setAddress(AddressType value) < this.address = value; >>
4. Демонстрация работы программы
В проект включен файл Readme с описанием доступных опций и аргументов командной
строки:
XmlProcessor v1.0 Usage: java -jar XmlProcessorDrv [-d ] [-h] [-v] -h,--help Display this help -v Version of the program -d Folder with XML files to be validated Example: java -jar xmlProcessor.jar --help -v -d "C:\\XmlSample"
Для запуска проекта из cmd скомпилируем jar, вызвав Maven build package на pom.xml, и в
cmd введем вышеописанную команду
java -jar xmlProcessor.jar -h -v -d «C:\XmlSample»
Директория C:\XmlSample должна содержать один или несколько файлов вида Address.xml и
Client.xml. Файлы с расширением не xml будут проигнорированы.
Пример корректной работы программы:
Программа выдаст ошибку, если длина поля превышает установленный в SimpleTypes.xsd предел, имеется опечатка в имени узла, итд. Для примера допустим, что первый элемент адреса написан как AApartment:
V001.000.00 50 7 Sadovaya Saint Petersburg Russia 123456
В этом случае программа выдаст ошибку: