Android: XML-Datei zur Kompilierzeit validieren?

8

Ich muss eine benutzerdefinierte XML-Datei erstellen, die in meiner Android-Anwendung verwendet werden kann,

Die Datei enthält einige benutzerdefinierte Objekte, die in meiner App benötigt werden,

Ich verstehe, dass ich sie in die res\xml oder res\raw setzen muss. OK.

Nun möchte ich zur Kompilierzeit benachrichtigt werden, wenn im XLM etwas nicht stimmt:

zum Beispiel:

Angenommen, ich möchte Katzen über XML definieren:

%Vor%

Ich würde gerne wissen, ob es möglich ist, eine Kompilierzeitwarnung zu erhalten, wenn ich etwas in der Art mache:

(wo Bellen ist nicht etwas, das ich definiert habe, können meine Katzen tun):

%Vor%

Ist das möglich?

Bitte, wie kann ich es erreichen?

    
Lisa Anne 05.01.2016, 12:43
quelle

3 Antworten

4

Das Folgende wird auf dem Gradle-Build-System funktionieren.

Definieren Sie zuerst ein Xml-Schema (XSD) -Dokument, das genau angibt, wie die Struktur des XML-Dokuments aussehen soll. Zum Beispiel in einer Datei test.xsd :

%Vor%

Im obigen Beispiel gibt das XSD-Dokument an, dass wir nur <animal> -Tags mit nur 3 Attributen haben dürfen: Name, Alter und Sound. Auch Datentypen dieser Attribute wurden streng definiert. Wenn Sie XML-Schemas nicht kennen, können Sie einige Online-Dokumentationen lesen.

Erstellen Sie als Nächstes ein XML-Dokument, das dem obigen Schema folgen soll, indem Sie auf text.xsd als sein Schema verweisen. Zum Beispiel in einer Datei test.xml :

%Vor%

Wie Sie sehen können, haben wir absichtlich ein Tag <cat> hinzugefügt, das in der von uns definierten Schemadefinition nicht enthalten ist.

  

Wenn Sie Android Studio verwenden, sucht es automatisch nach dem   Schemadatei und bieten Auto-Vervollständigen sowie Highlight-Schema   Fehler beim Bearbeiten der XML-Datei.

Aber der Zweck besteht darin, das XML-Dokument mit dem XSD-Schema zu validieren, jedes Mal, wenn Gradle das Android-Projekt erstellt. Also definieren wir eine benutzerdefinierte Gradle-Aufgabe, um dies zu tun. Zum Beispiel in build.gradle :

%Vor%

Hier verwenden wir die Java XML-API, um einen groovigen Code zu schreiben, der beide Dateien liest und die XML-Datei mit der XSD-Datei validiert. Sie können diese Aufgabe jetzt über Gradle CLI ausführen:

Zum Beispiel:

%Vor%

Es wird mit dem Fehler fehlschlagen:

%Vor%

Großartig. Jetzt möchten wir, dass die validateXml Aufgabe jedes Mal ausgeführt wird, wenn das Projekt erstellt wird. Genauer gesagt, wenn Dateien gepackt werden. Also fügen wir der Gradle-Build-Datei eine weitere Zeile hinzu (nach dem Definieren von validateXml task):

%Vor%

Jetzt ruft assemble task validateXml automatisch beim Build auf.

In Zukunft können Sie einfach die XSD-Datei aktualisieren, um neue Regeln für die XML-Datei anzuwenden.

    
S.D. 05.01.2016, 13:50
quelle
1

Android Lint benutzerdefinierte Regeln zur Rettung. Sie können Ihre benutzerdefinierte Flusenregel wie hier hier erstellen und vor jedem Build Prüfungen durchführen. Wenn etwas mit Ihrer benutzerdefinierten XML-Datei nicht stimmt, werden Sie in der Konsole benachrichtigt.

    
Veaceslav Gaidarji 05.01.2016 12:57
quelle
1

Vorschlag: Wenden Sie sich dafür auf Unit-Tests.

Sie können Produktionscode erstellen, der die Integrität Ihres XML-Codes überprüft (z. B. durch Ausführen eines Parsers, einschließlich Schema-Validierung). dann führen Sie diesen Code nur in bestimmten Komponententests aus. (Offensichtlich ist es ein bisschen komplizierter; du musst sorgfältig studieren, was für dich am sinnvollsten ist; aber gut, wir machen etwas Ähnliches; und es erweist sich als äußerst hilfreich).

Nicht genau "Kompilierzeit", sondern nah - da viele IDEs erlauben, bestimmte Komponententests auszuführen, wenn bestimmte Dateien geändert werden. Und natürlich sind Ihre Komponententests dann Teil Ihrer Unit-Test-Regression.

    
GhostCat 05.01.2016 12:57
quelle

Tags und Links