XML(eXtensible Markup Language)是一种用于使用自定义标签存储和传输结构化数据的文本格式。它广泛用于配置文件、Web服务和Android开发。根据W3C联盟的数据,XML规范自2008年以来一直是一个稳定的标准。XML提供了严格的数据结构,并支持通过模式进行验证。
要点
XML是一种标记语言,定义了以人和机器可读的格式编码文档的规则集。与HTML不同,XML没有固定的标签集——开发人员创建与数据结构对应的自定义标签。
XML由W3C联盟于1996年开发,是SGML(标准通用标记语言)的简化子集。XML的主要目标是分离内容和数据呈现。与描述外观的HTML不同,XML描述数据的结构和含义。
XML的关键特性是可扩展性。如果项目中出现了新的数据类型,开发人员只需添加新标签而无需更改现有结构。这使得XML非常适合长期数据存储和不同系统之间的交换。
XML语法比HTML更严格。每个开始标签必须有对应的结束标签,属性用引号括起来,标签名称区分大小写。文档必须有一个包含所有其他元素的根元素。
XML文档可以以声明开始,指明XML版本和编码。然后是根元素,其中可以包含嵌套元素、属性、文本内容和注释。空元素写为
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="bk001">
<title>XML Developer Guide</title>
<author>John Smith</author>
<price currency="USD">29.99</price>
<published>2026-03-15</published>
</book>
<book id="bk002">
<title>Advanced XML Schemas</title>
<author>Jane Doe</author>
<price currency="USD">49.99</price>
</book>
</catalog>
Well-formed XML必须遵守基本规则:每个开始标签必须有闭合标签,嵌套严格(禁止标签交叉),属性值始终在引号中。违反任何规则都会使文档无效且无法解析。
XML命名空间(XML Namespaces)解决了当一个文档中使用来自不同词典的元素时的名称冲突问题。命名空间由带URI的xmlns属性定义,该URI唯一标识词典。
XML Schema(XSD)是一种描述XML文档结构的语言。XSD确定允许哪些元素和属性、它们的数据类型、必填性和约束。模式允许在处理前自动验证文档,这对于集成解决方案至关重要。
| 技术 | 用途 | 示例 |
|---|---|---|
| DTD | 基本结构验证 | 旧的,功能较少 |
| XSD | 严格类型化和验证 | 行业标准 |
| RELAX NG | XSD的紧凑替代方案 | 比XSD更简单易读 |
| XSLT | 将XML转换为其他格式 | XML转换为HTML、PDF、CSV |
| XPath | 导航和选择节点 | 对XML树的查询 |
XML在Android开发中扮演着关键角色。Android操作系统使用XML来描述用户界面(布局文件)、应用程序配置(AndroidManifest.xml)、资源(字符串、颜色、主题)和矢量图形(VectorDrawable)。在iOS上,XML使用较少,主要用于Storyboard和plist配置文件。
在Android中,应用程序的每个屏幕都由一个包含View组件层次结构的XML文件描述:ConstraintLayout、LinearLayout、TextView、Button。这种方法将应用程序逻辑与表示分离,简化了维护和适应不同屏幕的工作。资源XML文件允许在不更改代码的情况下本地化应用程序。
典型的布局文件包含一个根ConstraintLayout和嵌套元素,每个元素都有位置、尺寸和样式属性。Android将XML编译为二进制AXML格式,以优化启动时的性能。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/welcome"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/click"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
XML解析在移动平台上有两种主要方法:DOM(文档对象模型)将整个文档作为树加载到内存中,SAX(XML简单API)流式读取文档并调用事件处理程序。DOM适用于小型文档,SAX适用于有内存限制的大文件。
Android上有内置解析器:用于流式分析的XmlPullParser和用于DOM方法的DocumentBuilder。iOS上使用Foundation XMLParser和委托协议。将对象序列化为XML时,经常使用PHP中的SimpleXML或Java中的Jackson XML等库。
在Android上,建议使用XmlPullParser进行高效的XML解析。解析器在事件模式下工作:调用next()移动到下一个元素并返回事件类型(START_TAG、TEXT、END_TAG)。这允许以最小的内存消耗处理任意大小的文档。
import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserException
import java.io.IOException
fun parseCatalog(parser: XmlPullParser): List<Book> {
val books = mutableListOf<Book>()
var eventType = parser.getEventType()
var currentBook: Book? = null
while (eventType != XmlPullParser.END_DOCUMENT) {
when (eventType) {
XmlPullParser.START_TAG -> {
when (parser.getName()) {
"book" -> currentBook = Book()
"title" -> parser.next()
"author" -> parser.next()
}
}
XmlPullParser.TEXT -> {
currentBook?.apply {
title = parser.getText() ?: ""
}
}
XmlPullParser.END_TAG -> {
if (parser.getName() == "book") {
currentBook?.let { books.add(it) }
}
}
}
eventType = parser.next()
}
return books
}
使用示例显示了XML在实际项目中的作用。除了Android开发之外,XML还用于编译配置、数据描述和文档流程。了解XML语法对于使用Maven、SOAP服务和许多企业工具是必需的。
pom.xml文件描述Maven项目:依赖项、插件、版本和编译配置文件。每个依赖项由groupId、artifactId和version标签指定。Maven自动从仓库加载指定的库。
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
XML和JSON之间的选择取决于项目的具体要求。JSON适用于REST API、移动应用程序和需要紧凑性和速度的配置。XML在企业系统、文档流程和Android开发中是不可替代的,这些领域需要严格的验证、命名空间和数据转换。
XML在长期文档存储场景中胜出。得益于XSD模式,XML文档可以自动验证,这对于医疗、金融和法律系统至关重要。XSLT转换允许从单个XML源生成HTML、PDF和其他格式,简化了文档流程。
而JSON已成为Web API和移动应用程序的标准。与JavaScript集成的简单性、更小的尺寸和更高的解析速度使JSON成为REST API、WebSocket消息和配置文件的首选。对于大多数新项目,建议从JSON开始,只有在出现特定需求时才转向XML。
常见问题
XML描述数据的结构和内容,HTML描述外观和展示。XML允许创建任意标签,HTML有固定集合。XML的语法更严格:所有标签必须闭合,HTML允许未闭合的标签。XML用于数据,HTML用于显示。
XSD(XML Schema Definition)是一种描述XML文档结构的语言。XSD确定允许哪些元素和属性、它们的数据类型、必填性和约束。模式允许在处理前自动验证XML文档,防止错误并保证数据完整性。
在Android上解析XML请使用XmlPullParser——内置的流式解析器。它在事件模式下工作:在循环中处理START_TAG、TEXT和END_TAG,高效管理内存。对于小型文档,通过DocumentBuilderFactory将整个文档作为节点树加载到内存中的DOM解析器是合适的。
DTD(文档类型定义)是一种旧的验证机制,功能有限:不支持数据类型(都是字符串)和命名空间。XSD是一种现代替代方案,支持数据类型(数字、日期、枚举)、命名空间和可扩展性。XSD本身是一个XML文档,DTD使用自己的语法。
命名空间防止当XML文档合并来自不同来源的元素时发生名称冲突。例如,在Android布局中,View标签可能来自android.view或某个库。带URI的xmlns属性唯一标识每个元素和属性的来源。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。