Poniższe czynności będą działać w systemie gradle build.
Najpierw należy zdefiniować dokument Xml Schema (XSD), który dokładnie określa, jaka powinna być struktura dokumentu XML. Na przykład w pliku test.xsd
:
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
<xs:element name="animals">
<xs:complexType>
<xs:sequence minOccurs="0">
<xs:element name="animal">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="age" type="xs:int"/>
<xs:attribute name="sound" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
W powyższym przykładzie dokument XSD określa, że możemy mieć tylko <animal>
tagi z zaledwie 3 atrybuty: imię, wiek i dźwiękowych. Również typy danych tych atrybutów zostały ściśle określone. Jeśli nie znasz schematów XML, możesz przeczytać o numerze online documentation.
Następnie utwórz dokument XML, który powinien nadążać za schematem, odwołując się do text.xsd
jako jego schematu.Na przykład w pliku test.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation='test.xsd'>
<animal name="kitty" age="2" sound="meow"/>
<cat name="bad_cat"></cat>
</animals>
Jak widać, mamy celowo dodali tag <cat>
, co nie jest tam w definicji schematu po prostu zdefiniowane.
If you are using Android Studio, it will automatically lookup the schema file and provide auto-complete, as well as highlight schema errors when editing the XML file.
Jednak celem jest weryfikacja dokumentu XML za pomocą schematu XSD, za każdym razem, gdy Gradle tworzy projekt Androida. W tym celu definiujemy niestandardowe zadanie Gradle. Na przykład, w build.gradle
:
import javax.xml.XMLConstants
import javax.xml.transform.stream.StreamSource
import javax.xml.validation.SchemaFactory
task validateXml {
File xml = new File('./test.xml');
File xsd = new File('./test.xsd');
def factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
def schema = factory.newSchema(xsd);
def validator = schema.newValidator();
validator.validate(new StreamSource(xml));
}
Tutaj używamy Java XML API, aby napisać kod, który czyta groovy oba pliki i sprawdza plik XML przy użyciu pliku XSD. Teraz można uruchomić to zadanie z Gradle CLI:
Na przykład:
./gradlew validateXml
To się nie uda, z błędem:
A problem occurred evaluating root project 'Bad Cats'.
> cvc-complex-type.2.4.d: Invalid content was found starting with element 'cat'. No child element is expected at this point.
Wielki. Teraz chcemy, aby zadaniebyło uruchamiane co godzinę, gdy projekt został zbudowany. Dokładniej, gdy pliki są pakowane. Tak, dodamy jeszcze jedną linię do Gradle zbudować plik (po zdefiniowaniu validateXml
zadania):
assemble.dependsOn validateXml;
Teraz assemble
zadanie wezwie validateXml
automatycznie na budowie.
W przyszłości można po prostu zaktualizować plik XSD, aby zastosować nowe reguły dla pliku XML.
to naprawdę wspaniałe, dzięki! –