0

0

Drupal模块如何处理XML文件导入

星降

星降

发布时间:2026-01-15 09:25:02

|

450人浏览过

|

来源于php中文网

原创

simplexml_load_file() 常失败因 Drupal 禁用 allow_url_fopen,远程 URL 触发 I/O 警告;本地文件需确保 web 用户读权限;推荐改用 file_get_contents() + simplexml_load_string() 组合并手动检查返回值。

drupal模块如何处理xml文件导入

Drupal模块读取XML文件时,simplexml_load_file() 为什么常失败?

因为 Drupal 的 PHP 运行环境常禁用 allow_url_fopen,而 simplexml_load_file() 直接传 URL 路径(如 'https://example.com/data.xml')会触发该限制并报错:Warning: simplexml_load_file(): I/O warning : failed to load external entity。本地文件路径(如 '/tmp/import.xml')则通常可用,但需确保 web 用户有读权限。

实操建议:

  • 优先用 file_get_contents() + simplexml_load_string() 组合,绕过 allow_url_fopen 限制
  • 若 XML 来自远程,改用 drupal_http_request()(D7)或 HttpClient(D8/D9/D10)获取原始字符串再解析
  • 始终用 @ 抑制 simplexml_load_string() 的警告,并手动检查返回值是否为 false

在 Drupal 8+ 中用 XmlEncoder 解析 XML 是否可行?

不可行。XmlEncoder(来自 Symfony Serializer)只支持「序列化」(PHP → XML),不支持反向「反序列化」(XML → PHP 数组/对象)。试图用它解析导入的 XML 文件会静默失败或抛出 NotEncodableValueException

正确做法是坚持用原生扩展:

  • simplexml_load_string($xml_content) 返回 SimpleXMLElement 对象,适合结构清晰、无命名空间的 XML
  • 含复杂命名空间或需严格错误控制时,改用 XMLReader(流式解析,内存友好)
  • 若需转成数组,用 json_decode(json_encode((array)$xml), TRUE) 是常见 hack,但会丢失属性、重复标签处理不可靠

如何安全地将 XML 数据映射到 Drupal 实体(如 Node 或 Custom Entity)?

不能直接把 XML 节点名当字段名硬编码。Drupal 字段存储逻辑(如多值字段、引用关系、格式化文本)和 XML 结构往往不一致,硬映射易导致数据截断或引用失效。

Python之模块学习 中文WORD版
Python之模块学习 中文WORD版

本文档主要讲述的是Python之模块学习;python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题。模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象,则要导入这个模块才可以使用,除了系统默认的模块(内置函数)不需要导入外。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

推荐分步处理:

  • 先用 SimpleXMLElement 提取关键数据到关联数组,例如:$data['title'] = (string)$xml->item->title,显式类型转换防对象残留
  • \Drupal::entityTypeManager()->getStorage('node')->create() 创建实体,而非直接操作数据库
  • 对文本字段,设 'format' => 'basic_html' 等可用格式;对实体引用字段(如 field_tags),传入目标实体 ID 数组而非名称
  • 调用 $node->save() 前,用 $node->validate() 检查必填字段和格式,避免静默失败

批量导入大 XML 文件时,为什么页面超时或内存溢出?

因为默认用 simplexml_load_string() 会把整个 XML 加载进内存构建 DOM 树,10MB XML 可能占用 50MB+ 内存,且 Drupal 的前端请求有 max_execution_time 限制(通常 30 秒)。

解决方案必须脱离 HTTP 请求生命周期:

  • 把导入逻辑写成 Drush 命令(DrushCommand 类),通过终端执行,不受网页超时和内存限制影响
  • 对超大文件(>5MB),改用 XMLReader 流式逐节点读取,配合 batch_set() 分批保存(D7)或 BatchBuilder(D8+)
  • 禁用 Drupal 缓存临时层:\Drupal::service('cache.default')->deleteAll(),避免 XML 解析中间结果撑爆缓存表

真正麻烦的是命名空间嵌套和 CDATA 内容提取——这些细节在测试小样例时不会暴露,上线后才突然卡住,得留足调试时间。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2531

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1604

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1496

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1416

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

0

2026.01.15

热门下载

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

精品课程

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

共137课时 | 8.7万人学习

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

共6课时 | 7万人学习

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

共13课时 | 0.9万人学习

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

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