Android:在编译时validationxml文件?

我需要创build一个自定义的XML文件在我的Android应用程序中使用,

该文件将包含我的应用程序中需要的一些自定义对象,

我知道我需要把它们放在res\xmlres\raw 。 好。


现在,我希望在编译时通知XLM中有什么错误:

例如:

假设我想通过XML定义猫:

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

我想知道是否有可能得到一个编译时间的警告,如果我做这样的事情:

(吠叫不是我定义我的猫可以做的):

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

那可能吗?

请问我该怎么做到?

Solutions Collecting From Web of "Android:在编译时validationxml文件?"

以下将在Gradle构build系统上工作。

首先,定义一个Xml Schema(XSD)文档,指定XML文档的结构。 例如,在一个文件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> 

在上面的例子中,XSD文档指定我们只有<animal>标签只有3个属性:名字,年龄和声音。 这些属性的数据types也被严格定义。 如果你不熟悉XML模式,你可以阅读一些在线文档 。

接下来,通过引用text.xsd作为其模式,创build一个应该遵循上述模式的XML文档。 例如,在一个文件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> 

正如你所看到的,我们有意添加了一个<cat>标签,这个标签在我们刚刚定义的模式定义中不存在。

如果您使用的是Android Studio,它将自动查找架构文件并提供自动完成function,并在编辑XML文件时突出显示架构错误。

但是,目的是用XSD模式validationXML文档,每次Gradle构buildAndroid项目。 所以,我们定义一个自定义的Gradle任务来做到这一点。 例如,在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)); } 

在这里,我们使用Java XML API来编写一些读取这两个文件的Groovy代码,并使用XSD文件validationXML文件。 您现在可以从Gradle CLI运行此任务:

例如:

 ./gradlew validateXml 

它会失败,错误:

 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. 

大。 现在我们希望每次构build项目时都运行validateXml任务。 更具体地说,文件打包时。 所以,我们再添加一行到Gradle构build文件(在定义validateXml任务之后):

 assemble.dependsOn validateXml; 

现在, assemble任务将在构build时自动调用validateXml

将来,您只需更新XSD文件即可为XML文件应用新的规则。

Android Lint自定义规则来拯救。 您可以按照此处所述创build自定义lint规则,并在每次构build之前运行检查。 如果您的自定义XML文件出现问题,您将在控制台中收到通知。

build议:转到unit testing。

您可以创build生产代码来检查XML的完整性(例如,通过运行parsing器;包括模式validation); 那么你只需在某些unit testing中运行该代码即可。 (显然这样更复杂一点,你必须仔细研究什么对你最有意义,但是,我们做了类似的事情,而且事实certificate这是非常有用的)。

不完全是“编译时间”,而是接近 – 因为许多IDE允许您在更改某些文件时运行某些unit testing。 当然,你的unit testing将成为你的unit testing回归的一部分。