乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • XML 基础语法

    • XML 概述
    • XML 文档结构
    • XML 元素
    • XML 属性
    • XML 语法规则
    • XML 命名空间
    • XML 注释与处理指令
  • DTD 与文档验证

    • DTD 概述
    • DTD 元素声明
    • DTD 属性声明
    • DTD 实体声明
    • DTD 元素与属性对比
    • DTD 完整示例
  • XML Schema 定义

    • XML Schema 概述
    • XSD 简单类型
    • XSD 复杂类型
    • XSD 命名空间与引用
  • XPath 节点定位

    • XPath 概述
    • XPath 路径表达式
    • XPath 谓词与函数
  • XSLT 转换

    • XSLT 概述
    • XSLT 模板与匹配
    • XSLT 控制结构
    • XSLT 输出控制
  • XML 解析技术

    • XML 解析概述
    • DOM 解析
    • SAX 解析
    • StAX 解析
    • XML 与 Java — JAXP
  • XML 在 Java 中的应用

    • Spring XML 配置
    • MyBatis XML 映射
    • pom.xml 与 Maven
    • web.xml 配置详解
  • 现代数据格式对比

    • XML 与 JSON 对比
    • XML 与 YAML 对比
  • XML 显示与浏览器集成

    • XML 在浏览器中的显示
    • XMLHttpRequest 与 AJAX
    • 服务器端 XML 处理
  • XML 进阶查询与链接

    • XQuery 查询语言
    • XLink 超链接
    • XML 验证工具使用
  • XML Web 服务(选读)

    • XML Web 服务概述
    • SOAP 协议详解
    • WSDL 服务描述
    • RSS 内容聚合
    • RDF 资源描述框架

XML 文档结构

本章定位 :理解 XML 文档的树形层级结构——根元素、父子嵌套、兄弟节点、DOM 七种节点类型,以及 XML 声明的格式要求。

定义与作用

XML 文档是一种 树形结构——从唯一的根元素开始,逐层展开为分支和叶子。这种结构与计算机科学中的"树"数据结构完全对应,使得程序可以用统一的递归算法遍历、查询和修改 XML。

DOM(Document Object Model)将 XML 文档映射为包含 七种节点类型 的内存树。理解这七种节点,是后续学习 XPath 定位和 DOM 编程的基础。

核心原理:从文本到树

图解释 :XML 解析器将纯文本逐行解析为内存中的节点树。文档本身是一个节点(#document),XML 声明变成处理指令节点,注释变成注释节点。属性节点挂在元素节点上但不是子节点。

语法/结构要点

XML 声明

文档第一行必须是 XML 声明(XML 1.0 中可选但强烈推荐):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
属性说明可选值
versionXML 版本"1.0" 或 "1.1"
encoding字符编码"UTF-8", "UTF-16", "ISO-8859-1" 等
standalone是否依赖外部 DTD"yes" 或 "no"

standalone="yes" 表示文档完全自包含,不需要外部 DTD 或实体文件。

DOM 七种节点类型

节点类型nodeTypenodeNamenodeValue
元素1标签名null
属性2属性名属性值
文本3#text文本内容
CDATA4#cdata-sectionCDATA 内容
实体引用5实体名null
处理指令7targetinstruction
注释8#comment注释文本
文档9#documentnull

树结构术语

<bookstore>              ← 根元素(root element)
  <book>                 ← book 是 bookstore 的子元素
    <title>...</title>   ← title 和 price 是 book 的子元素,互为兄弟
    <price>...</price>
  </book>
</bookstore>
术语说明
根元素文档最外层的唯一元素,所有其他元素的祖先
父元素直接包含该元素的上一级元素
子元素被直接包含的下一级元素
兄弟同属一个父元素的同级元素
后代所有嵌套在该元素内的元素(子、孙、曾孙...)
祖先所有包含该元素的上级元素(父、祖父...)

完整示例:大翔用 DOM 树诊断配置错误

场景说明

飞翔科技的运维 大翔 接到告警:一台 Web 服务器启动失败,日志显示 XML 配置解析错误。他打开 server-config.xml,一眼看不出问题。大翔决定用 Python 解析这个文件,通过 DOM 树诊断结构异常。

操作前:有结构错误的 XML

<?xml version="1.0" encoding="UTF-8"?>
<!-- 飞翔科技服务器配置 -->
<server-cluster>
  <server id="web01">
    <host>192.168.1.10</host>
    <port>8080</port>
  <load-balancer id="lb01">
    <algorithm>round-robin</algorithm>
    <port>80</port>
  </load-balancer>
</server-cluster>

诊断过程:用 Python 检查 DOM 结构

import xml.dom.minidom

xml_str = '''<?xml version="1.0" encoding="UTF-8"?>
<server-cluster>
  <server id="web01">
    <host>192.168.1.10</host>
    <port>8080</port>
  <load-balancer id="lb01">
    <algorithm>round-robin</algorithm>
    <port>80</port>
  </load-balancer>
</server-cluster>
'''

try:
    dom = xml.dom.minidom.parseString(xml_str)
except Exception as e:
    print(f"解析失败: {e}")

# 手动检查文档结构
root = dom.documentElement
print(f"根元素: {root.nodeName}")
print(f"子节点数: {root.childNodes.length}")

for i in range(root.childNodes.length):
    child = root.childNodes[i]
    if child.nodeType == 1:
        print(f"  元素[{i}]: <{child.nodeName}>")
    elif child.nodeType == 3:
        text = child.nodeValue.strip()
        if text:
            print(f"  文本[{i}]: '{text}'")

操作结果

诊断发现 <server> 没有关闭标签——缺少 </server>。修复后:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 飞翔科技服务器配置 -->
<server-cluster>
  <server id="web01">
    <host>192.168.1.10</host>
    <port>8080</port>
  </server>                      <!-- ← 补上关闭标签 -->
  <load-balancer id="lb01">
    <algorithm>round-robin</algorithm>
    <port>80</port>
  </load-balancer>
</server-cluster>

修复后 DOM 树变为:根元素(server-cluster)→ 两个子元素(server + load-balancer)→ 各自包含子元素和文本节点。大翔总结:"XML 文档=树。学 XML 就是学会在树上走路、查节点、剪叶子。"

易错场景

错误一:两个根元素

<!-- ❌ 一个 XML 文档只能有一个根元素 -->
<books>...</books>
<authors>...</authors>

<!-- ✅ 用统一的根元素包裹 -->
<library>
  <books>...</books>
  <authors>...</authors>
</library>

错误二:误把属性当子节点

JavaScript/Flex 中常见:试图用 childNodes 获取属性,但属性不在 childNodes 里。必须用 getAttribute() 或 attributes 集合。

错误三:忽略空白文本节点

DOM 中元素之间的换行和缩进也会产生 #text 节点。遍历 childNodes 时要过滤 nodeType == 1(只取元素)或 nodeType == 3 && nodeValue.trim()。

面试考点

考点参考答案要点
DOM 有哪几种节点类型?七种:元素(1)、属性(2)、文本(3)、CDATA(4)、实体引用(5)、处理指令(7)、注释(8)、文档(9)。最常用的是元素和文本节点
XML 声明是必须的吗?XML 1.0 可选但推荐,XML 1.1 必需。如果使用 UTF-16 或非默认编码,声明是必要的,否则解析器可能乱码
如何理解 XML 文档=树?从唯一根元素开始,通过父子关系形成层级结构。这种结构天然适合递归遍历,是 XPath、XSLT、DOM 编程的共同基础
上一页
XML 概述
下一页
XML 元素