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

    • 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 数据——包括 PHP/ASP 动态生成 XML、从数据库输出 XML、以及在服务器端执行 XSLT 转换的完整流程。

定义与作用

服务器端 XML 处理 指在 Web 服务器一侧完成的 XML 相关操作,主要包括:

  1. 生成 XML :用服务器端语言(PHP、ASP、Java 等)动态创建 XML 响应
  2. 存储 XML :将 XML 文件直接存放在服务器文件系统
  3. 转换 XML :在服务器端执行 XSLT 转换,将 XML 转为 HTML 后发送给浏览器

为什么要在服务器端处理?因为浏览器只能渲染 XML,不能"生成"或"转换"XML。当数据来自数据库、需要动态组合时,服务器端处理是必经之路。

核心原理:服务器端 XML 处理流程

图解释 :服务器端 XML 有三条典型路径。A:静态 XML 文件直接返回(适合不变的数据);B:动态从数据库查询后拼装 XML 返回(适合实时数据);C:对 XML 执行 XSLT 转换后以 HTML 形式返回(适合需要浏览器渲染的场景)。核心原则:Content-Type 必须设为正确的 MIME 类型。

语法/结构要点

Content-Type 声明

用途Content-Type说明
返回 XML 数据text/xml 或 application/xml浏览器将响应解析为 XML,AJAX 中 responseXML 可用
返回 HTML(XSLT 转换后)text/html浏览器当作普通网页渲染
返回 JSONapplication/json现代 API 首选,但不在本章讨论范围

关键 :如果不设置 Content-Type,XHR 的 responseXML 将是 null。

PHP 生成 XML 的关键点

  • 必须调用 header("Content-type: text/xml") 在 任何输出之前
  • XML 声明 <?xml ...?> 需要 拼接输出 (因为 <? 是 PHP 的短标签)
  • 字符串拼接方式输出 XML 元素

ASP 生成 XML 的关键点

  • response.ContentType = "text/xml"
  • 使用 response.Write() 逐行输出 XML
  • 数据库数据通过 ADO/ADODB 连接获取

服务器端 XSLT 转换

  • 加载 XML 文件到 DOM
  • 加载 XSL 文件到 DOM
  • 调用 transformNode()(ASP)或 XSLTProcessor(PHP)执行转换
  • 输出结果为 HTML

完整示例

场景说明

飞翔科技后端 大翔 要给前端小崔提供一个"客户订单"API。数据库中有客户订单表,需要用 XML 格式返回。架构师 白歌 建议同时实现三种输出方式:动态 XML、XSLT 转换后的 HTML、以及静态 XML 文件兜底。

策略 B:PHP 动态生成 XML(从数据库查询)

数据库表结构 (orders 表):

order_idcustomerproductquantitypriceorder_date
1001大翔工单模块2500002026-05-10
1002白歌画像引擎1800002026-06-01

orders.php :

<?php
// 步骤1:设置响应头(必须在任何输出之前)
header("Content-type: text/xml; charset=utf-8");

// 步骤2:连接数据库
$conn = new mysqli("localhost", "root", "password", "feixiang_db");
if ($conn->connect_error) {
    // 即使在错误情况下,也应返回 XML 格式的错误信息
    header("Content-type: text/xml");
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<error>数据库连接失败:' . $conn->connect_error . '</error>';
    exit;
}

// 步骤3:查询数据
$result = $conn->query("SELECT order_id, customer, product, quantity, price, order_date FROM orders ORDER BY order_date DESC");

// 步骤4:输出 XML(逐行拼接)
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo "<orders>";

while ($row = $result->fetch_assoc()) {
    echo "<order>";
    echo "<order_id>" . $row['order_id'] . "</order_id>";
    echo "<customer>" . htmlspecialchars($row['customer']) . "</customer>";
    echo "<product>" . htmlspecialchars($row['product']) . "</product>";
    echo "<quantity>" . $row['quantity'] . "</quantity>";
    echo "<price>" . $row['price'] . "</price>";
    echo "<order_date>" . $row['order_date'] . "</order_date>";
    echo "</order>";
}

echo "</orders>";

$conn->close();
?>

关键注意 :htmlspecialchars() 防止数据中的 &、<、> 破坏 XML 结构。

PHP 输出效果

浏览器访问 orders.php 得到:

<?xml version="1.0" encoding="UTF-8"?>
<orders>
  <order>
    <order_id>1001</order_id>
    <customer>大翔</customer>
    <product>工单模块</product>
    <quantity>2</quantity>
    <price>50000</price>
    <order_date>2026-05-10</order_date>
  </order>
  <order>
    <order_id>1002</order_id>
    <customer>白歌</customer>
    <product>画像引擎</product>
    <quantity>1</quantity>
    <price>80000</price>
    <order_date>2026-06-01</order_date>
  </order>
</orders>

策略 C:服务器端 XSLT 转换(ASP 示例)

不需要前端小崔自己写 XSLT——在服务器端完成转换,直接返回给浏览器友好的 HTML。

transform.asp :

<%
' 设置输出类型为 HTML
Response.ContentType = "text/html"

' 加载 XML 文件
Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("orders.xml"))

' 加载 XSL 样式表
Set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("orders.xsl"))

' 执行转换并输出
Response.Write(xml.transformNode(xsl))
%>

图解释 :服务器端 XSLT 转换的三个步骤——(1) 创建 XMLDOM 对象加载 XML 源数据;(2) 创建另一个 XMLDOM 对象加载 XSLT 样式表;(3) 调用 transformNode() 执行转换,输出结果直接写入 HTTP 响应。

策略 A:静态 XML 文件

orders.xml 直接放在 Web 目录下,不需要任何脚本:

<?xml version="1.0" encoding="UTF-8"?>
<orders>
  <order>
    <order_id>1001</order_id>
    <customer>大翔</customer>
    <product>工单模块</product>
    <quantity>2</quantity>
    <price>50000</price>
  </order>
</orders>

通过 Web 服务器(Apache/Nginx/IIS)直接返回,Content-Type 通常由服务器根据 .xml 扩展名自动设置为 application/xml。

操作结果

策略URL浏览器看到的内容适用场景
静态 XMLorders.xml语法高亮 XML 树不变的数据、CD 目录
PHP 动态orders.phpXML 数据流实时订单查询
XSLT 转换transform.asp样式化的 HTML 表格直接给用户看的报表

三种方式互补:小崔的 AJAX 前端调用 orders.php 拿到 responseXML 做动态渲染;产品经理直接访问 transform.asp 看格式化报表。

易错场景

PHP 输出 XML 时出现 "headers already sent"

<?php
echo " ";  // 任何输出(即使是空格或 BOM)都会导致 header() 失败
header("Content-type: text/xml");  // Warning: Cannot modify header information

PHP 的 header() 必须在 任何 输出之前调用。检查文件开头是否有 BOM 头、空格、空行。

忘记处理特殊字符

// 错误:客户名包含 &,破坏 XML
echo "<customer>大翔 & 白歌</customer>";
// 输出:<customer>大翔 & 白歌</customer> — XML 解析失败

始终使用 htmlspecialchars() 转义 &、<、>、"、'。

XSLT 转换中忘记设置 async=false

' 错误:async 默认为 true,transformNode 调用时 DOM 可能未加载完成
Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.load(path)
Response.Write(xml.transformNode(xsl))  ' 可能为空白

在 ASP 中必须设置 xml.async = false 确保同步加载完成后再转换。

面试考点

考点参考答案要点
服务器端生成 XML 时要设置什么 HTTP 头?Content-Type: text/xml(或 application/xml),这是 responseXML 可用的前提
PHP 如何避免生成 XML 时出现语法错误?使用 htmlspecialchars() 转义特殊字符;header() 放在所有输出之前;XML 声明用字符串拼接而非直接写 <?xml
服务器端 XSLT vs 客户端 XSLT 的选择?服务器端:兼容所有浏览器、用户体验一致;客户端:减少服务器压力,但依赖浏览器内置 XSLT 支持
静态 XML、动态生成、XSLT 转换三者各自适合什么场景?静态:数据很少变化(CD 目录);动态:实时数据查询;XSLT:需要格式化输出的场景
上一页
XMLHttpRequest 与 AJAX