2016-01-05 16 views
8

muszę utworzyć niestandardowy plik XML, który ma być używany w mojej aplikacji Android,Android: sprawdź plik XML podczas kompilacji?

plik będzie zawierać kilka obiektów niestandardowych, które są potrzebne w mojej aplikacji,

Rozumiem, że muszę umieścić je w res\xml lub res\raw. OK.


Teraz chciałbym być zgłoszone w czasie kompilacji, jeśli coś jest nie tak w XLM:

na przykład:

Załóżmy, że chcemy zdefiniować koty poprzez XML:

<cats> 
    <siamese-cat 
     fur="short" 
     tail="5" /> 

    <persian-cat 
     fur="short" 
     tail="5" /> 
</cats> 

Chciałbym wiedzieć, czy można uzyskać ostrzeżenie o czasie kompilacji, jeśli zrobię coś takiego:

(gdzie szczekanie nie jest coś, co zdefiniowano moje koty mogą zrobić):

<cats> 
    <persian-cat 
     barks="true" 
     fur="short" 
     tail="5" /> 
</cats> 

Czy to możliwe?

Proszę, jak mogę to osiągnąć?

Odpowiedz

4

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.

+0

to naprawdę wspaniałe, dzięki! –

1

niestandardowe zasady dotyczące ratowania. Możesz utworzyć niestandardową regułę lint, zgodnie z opisem here i uruchamiać kontrole przed każdą kompilacją. Jeśli coś będzie nie tak z Twoim niestandardowym plikiem XML - otrzymasz powiadomienie w konsoli.

+0

Jeszcze lepszy pomysł! –

1

Sugestia: przejdź do testów jednostkowych.

Można utworzyć kod produkcyjny, który sprawdza integralność kodu XML (na przykład uruchamiając analizator składni, w tym sprawdzanie poprawności schematu); następnie uruchamiasz ten kod w ramach niektórych testów jednostkowych. (oczywiście jest to trochę bardziej skomplikowane, musisz dokładnie przestudiować, co jest dla ciebie najbardziej sensowne, ale cóż, robimy coś podobnego i okazuje się to niezwykle pomocne).

Niezupełnie "czas kompilacji", ale blisko - tyle IDE pozwala na uruchomienie pewnych testów jednostkowych po zmianie niektórych plików. Oczywiście twoje testy jednostkowe będą częścią regresji testu jednostkowego.

+0

Dobra sugestia, dzięki! –

Powiązane problemy