gpt4 book ai didi

java - Android:在编译时验证xml文件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:07:47 25 4
gpt4 key购买 nike

我需要创建一个自定义 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>

这可能吗?

请问我该如何实现?

最佳答案

以下将适用于 gradle 构建系统。

首先,定义一个 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 个属性的标签:姓名、年龄和声音。这些属性的数据类型也被严格定义。如果您不熟悉 XML 模式,可以阅读一些 online documentation .

接下来,引用text.xsd,创建一个应该遵循上述模式的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> ,这在我们刚刚定义的架构定义中不存在。

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.

但目的是在每次 Gradle 构建 android 项目时使用 XSD 模式验证 XML 文档。因此,我们定义了一个自定义 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 编写一些常规代码来读取这两个文件并使用 XSD 文件验证 XML 文件。您现在可以从 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.

太棒了。现在我们想要 validateXml 每次 构建项目时运行的任务。更具体地说,当文件被打包时。因此,我们在 Gradle 构建文件中再添加一行(在定义 validateXml 任务之后):

assemble.dependsOn validateXml;

现在,assemble任务将调用 validateXml自动生成。

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

关于java - Android:在编译时验证xml文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34612017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com