You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Sabre XML Writer生成XML异常,仅输出纯文本求助

解决Sabre XML Writer只输出纯文本的问题

我一眼就看出你代码里的几个关键问题,这才导致XML结构没生成,只输出了纯文本内容:

问题分析

  1. 缺少XML文档初始化:你没有调用startDocument()方法,Sabre XML Writer需要这个方法来启动XML文档的构建流程,否则不会生成任何XML标签结构。
  2. 命名空间URI不匹配:你的namespaceMap里映射的是http://example.org/到前缀e,但在write数组里使用的元素命名空间是http://example.org/ns,两者完全不一致,导致Writer无法识别该命名空间,自然不会生成对应的XML元素标签。
  3. 元素命名空间与映射不对应:即便忽略命名空间问题,元素的URI和映射表不匹配也会让Writer无法正确解析要生成的标签。

修正后的代码

$writer = new Sabre\Xml\Writer();
$writer->openMemory();
// 初始化XML文档,指定版本和编码(默认1.0,可省略编码参数)
$writer->startDocument('1.0', 'UTF-8');
// 确保命名空间映射和后续元素使用的URI完全一致
$writer->namespaceMap = [
    'http://example.org/' => 'e',
];
$writer->startElement('{http://example.org/}root');
// 元素的命名空间URI要和映射表中的保持一致
$writer->write([
    '{http://example.org/}title' => 'Foundation',
    '{http://example.org/}author' => 'Isaac Asimov',
]);
$writer->endElement();
// 结束文档(可选,但建议加上保证结构完整性)
$writer->endDocument();
echo $writer->outputMemory();

预期输出结果

运行修正后的代码,你会得到符合预期的XML结构:

<?xml version="1.0" encoding="UTF-8"?>
<e:root>
  <e:title>Foundation</e:title>
  <e:author>Isaac Asimov</e:author>
</e:root>

额外说明

如果你确实需要使用http://example.org/ns这个命名空间,只需要同步修改namespaceMap和所有元素的URI即可:

$writer->namespaceMap = [
    'http://example.org/ns' => 'e',
];
// 同时修改startElement和write数组里的元素URI
$writer->startElement('{http://example.org/ns}root');
$writer->write([
    '{http://example.org/ns}title' => 'Foundation',
    '{http://example.org/ns}author' => 'Isaac Asimov',
]);

内容的提问来源于stack exchange,提问作者prgrm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:18:03