XML:它是什么,文档结构和工作原理

作者: IT Sectr 发布日期: 2026-03-08 阅读时间: 8 分钟

XML(eXtensible Markup Language)是一种用于使用自定义标签存储和传输结构化数据的文本格式。它广泛用于配置文件、Web服务和Android开发。根据W3C联盟的数据,XML规范自2008年以来一直是一个稳定的标准。XML提供了严格的数据结构,并支持通过模式进行验证。

要点

  • XML — 一种可扩展的标记语言,使用自定义标签处理结构化数据
  • 严格的结构 — 必需的闭合标签、根元素和通过XSD进行验证
  • 命名空间 — 避免文档中名称冲突的机制
  • XSLT — 将XML转换为其他格式:HTML、PDF、CSV
  • Android开发 — XML用于布局、清单和资源

什么是XML?

XML是一种标记语言,定义了以人和机器可读的格式编码文档的规则集。与HTML不同,XML没有固定的标签集——开发人员创建与数据结构对应的自定义标签。

XML由W3C联盟于1996年开发,是SGML(标准通用标记语言)的简化子集。XML的主要目标是分离内容和数据呈现。与描述外观的HTML不同,XML描述数据的结构和含义。

XML的关键特性是可扩展性。如果项目中出现了新的数据类型,开发人员只需添加新标签而无需更改现有结构。这使得XML非常适合长期数据存储和不同系统之间的交换。

XML的主要应用领域

  • Android开发 — 布局文件、清单、资源(strings、colors、themes)
  • 配置 — Maven POM、Ant构建、Web配置(web.xml)
  • Web服务 — SOAP、XML-RPC、RSS/Atom订阅
  • 文档流程 — SVG、DocBook、Office Open XML
  • 数据库 — SQL Server(XML类型)、Oracle、PostgreSQL

XML语法和结构

XML语法比HTML更严格。每个开始标签必须有对应的结束标签,属性用引号括起来,标签名称区分大小写。文档必须有一个包含所有其他元素的根元素。

XML文档可以以声明开始,指明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>

格式良好的XML规则

Well-formed XML必须遵守基本规则:每个开始标签必须有闭合标签,嵌套严格(禁止标签交叉),属性值始终在引号中。违反任何规则都会使文档无效且无法解析。

  1. 一个根元素 — 文档只有一个根
  2. 正确的嵌套 — 标签不能交叉
  3. 闭合标签 — 除了自闭合标签外,所有元素都必须有
  4. 区分大小写 — <Book>和<book>是不同的元素
  5. 属性引号 — 属性值在双引号或单引号中

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在移动开发中

XML在Android开发中扮演着关键角色。Android操作系统使用XML来描述用户界面(布局文件)、应用程序配置(AndroidManifest.xml)、资源(字符串、颜色、主题)和矢量图形(VectorDrawable)。在iOS上,XML使用较少,主要用于Storyboard和plist配置文件。

在Android中,应用程序的每个屏幕都由一个包含View组件层次结构的XML文件描述:ConstraintLayout、LinearLayout、TextView、Button。这种方法将应用程序逻辑与表示分离,简化了维护和适应不同屏幕的工作。资源XML文件允许在不更改代码的情况下本地化应用程序。

Android布局示例

典型的布局文件包含一个根ConstraintLayout和嵌套元素,每个元素都有位置、尺寸和样式属性。Android将XML编译为二进制AXML格式,以优化启动时的性能。

xml
<?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解析

XML解析在移动平台上有两种主要方法:DOM(文档对象模型)将整个文档作为树加载到内存中,SAX(XML简单API)流式读取文档并调用事件处理程序。DOM适用于小型文档,SAX适用于有内存限制的大文件。

Android上有内置解析器:用于流式分析的XmlPullParser和用于DOM方法的DocumentBuilder。iOS上使用Foundation XMLParser和委托协议。将对象序列化为XML时,经常使用PHP中的SimpleXML或Java中的Jackson XML等库。

Android上的XML解析(Kotlin)

在Android上,建议使用XmlPullParser进行高效的XML解析。解析器在事件模式下工作:调用next()移动到下一个元素并返回事件类型(START_TAG、TEXT、END_TAG)。这允许以最小的内存消耗处理任意大小的文档。

kotlin
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示例

使用示例显示了XML在实际项目中的作用。除了Android开发之外,XML还用于编译配置、数据描述和文档流程。了解XML语法对于使用Maven、SOAP服务和许多企业工具是必需的。

Maven配置(POM)

pom.xml文件描述Maven项目:依赖项、插件、版本和编译配置文件。每个依赖项由groupId、artifactId和version标签指定。Maven自动从仓库加载指定的库。

xml
<?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:何时选择什么

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允许未闭合的标签。XML用于数据,HTML用于显示。

什么是XSD,它有什么用?

XSD(XML Schema Definition)是一种描述XML文档结构的语言。XSD确定允许哪些元素和属性、它们的数据类型、必填性和约束。模式允许在处理前自动验证XML文档,防止错误并保证数据完整性。

如何在Android上解析XML?

在Android上解析XML请使用XmlPullParser——内置的流式解析器。它在事件模式下工作:在循环中处理START_TAG、TEXT和END_TAG,高效管理内存。对于小型文档,通过DocumentBuilderFactory将整个文档作为节点树加载到内存中的DOM解析器是合适的。

DTD和XSD有什么区别?

DTD(文档类型定义)是一种旧的验证机制,功能有限:不支持数据类型(都是字符串)和命名空间。XSD是一种现代替代方案,支持数据类型(数字、日期、枚举)、命名空间和可扩展性。XSD本身是一个XML文档,DTD使用自己的语法。

为什么XML中需要命名空间?

命名空间防止当XML文档合并来自不同来源的元素时发生名称冲突。例如,在Android布局中,View标签可能来自android.view或某个库。带URI的xmlns属性唯一标识每个元素和属性的来源。

总结

  • XML — 可扩展的标记语言,使用自定义标签处理结构化数据
  • 严格的语法 — 必需的闭合标签、根元素、区分大小写
  • 命名空间和XSD模式确保验证并防止名称冲突
  • Android使用XML创建界面、资源和应用程序配置
  • 解析通过XmlPullParser(流式)或DOM(到内存中)进行
  • XSLT允许将XML转换为HTML、PDF和其他格式
  • 在REST API中受欢迎程度不如JSON,但XML在企业和Android领域不可替代

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读