0

0

PHP解析上传的XML SimpleXML如何加载临时文件

畫卷琴夢

畫卷琴夢

发布时间:2026-01-18 10:57:08

|

336人浏览过

|

来源于php中文网

原创

不能。simplexml 的 simplexml_load_file() 仅接受文件路径,而 $_files'xxx' 是受限的临时文件,易因清理、重命名或权限问题导致 i/o 错误;推荐用 simplexml_load_string() 配合 file_get_contents() 读取后解析,并按 xml 声明编码转 utf-8;慎用 direct simplexml_load_file(),须校验存在且可读;无需 move_uploaded_file() 增加冗余 i/o。

php解析上传的xml simplexml如何加载临时文件

SimpleXML 能直接加载 $_FILES 临时文件吗?

不能。SimpleXML 的 simplexml_load_file() 只接受文件路径(字符串),而 $_FILES['xxx']['tmp_name'] 虽然是个路径,但它是服务器临时文件,权限和生命周期受限;更关键的是,如果上传失败、被清理或路径被重命名,simplexml_load_file() 会直接报 Warning: simplexml_load_file(): I/O warning : failed to load external entity

正确加载上传 XML 临时文件的两种方式

推荐优先用 simplexml_load_string() 配合 file_get_contents(),避免路径权限/竞态问题;次选用 simplexml_load_file() 但必须校验临时文件存在且可读。

  • 方式一(推荐):读入内存后解析
    确保 $_FILES['xml_file']['error'] === UPLOAD_ERR_OK,再用 file_get_contents($_FILES['xml_file']['tmp_name']) 获取内容,传给 simplexml_load_string()
  • 方式二(慎用):直传临时路径
    仅当确认临时文件未被移动/删除,且 Web 进程有读取权限时可用:simplexml_load_file($_FILES['xml_file']['tmp_name']);但需手动检查 is_readable()file_exists()
  • 注意编码:若 XML 声明含 <?xml version="1.0" encoding="GBK"?>file_get_contents() 返回的原始字节需按对应编码转 UTF-8(用 mb_convert_encoding()),否则 simplexml_load_string() 可能解析失败或乱码
if ($_FILES['xml_file']['error'] === UPLOAD_ERR_OK) {
    $raw = file_get_contents($_FILES['xml_file']['tmp_name']);
    // 示例:处理 GBK 编码 XML
    if (preg_match('/encoding=["\']([^"\']+)/i', $raw, $m) && strtoupper($m[1]) !== 'UTF-8') {
        $raw = mb_convert_encoding($raw, 'UTF-8', $m[1]);
    }
    $xml = simplexml_load_string($raw);
    if ($xml === false) {
        throw new Exception('Invalid XML content');
    }
}

为什么不用 move_uploaded_file() 再加载?

没必要增加磁盘 I/O 和临时目录管理负担。上传后的 tmp_name 已是完整文件,只要没被 PHP 清理(脚本结束前都有效),直接读取最轻量。调用 move_uploaded_file() 后再用 simplexml_load_file(),只是多一次复制,还引入了目标目录权限、路径拼接、清理残留等新风险点。

INFINITE ALBUM
INFINITE ALBUM

面向游戏玩家的生成式AI音乐

下载

常见错误和绕过技巧

典型报错如 DOMDocument::loadXML(): Empty string supplied as inputparser error : Start tag expected, ',基本都是因为:

立即学习PHP免费学习笔记(深入)”;

  • $_FILES['xxx']['tmp_name'] 为空或上传失败($_FILES['xxx']['error'] !== UPLOAD_ERR_OK
  • XML 内容开头有 BOM 或不可见空白字符(用 ltrim($raw, "\xEF\xBB\xBF\x00..\x08\x0B\x0C\x0E\x0F\x10..\x1F") 清除)
  • PHP 配置禁用了 allow_url_fopen(不影响 file_get_contents 读本地文件,但影响某些远程加载场景)
  • SimpleXML 扩展未启用(检查 extension=php_simplexml.dllextension=simplexml
临时文件在脚本生命周期内有效,但它的内容是否“干净”、编码是否匹配、错误码是否被忽略——这些才是解析失败的真正源头。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1944

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2118

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1160

2024.11.28

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

451

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

373

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号