
本文介绍如何利用 PHP 的 XMLWriter 类,将过滤后的 RSS 数据数组转换为符合要求的 XML 格式(如 ......),重点解决因误用对象属性访问语法导致的运行错误。
本文介绍如何利用 php 的 xmlwriter 类,将过滤后的 rss 数据数组转换为符合要求的 xml 格式(如 `
在 PHP 中,将结构化数组高效、安全地序列化为标准 XML,推荐使用内置的 XMLWriter 扩展——它内存占用低、性能好,且能精确控制缩进与编码。你提供的代码逻辑基本正确,但核心问题在于:$electionresults 是一个关联数组(由 array(...) 显式构建),而非 SimpleXML 对象,因此不能用 $race->title 访问,而应使用数组下标语法 $race['title']。
此外,原始代码中还存在两处关键疏漏:
-
未声明元素名字符串:
$xml->startElement(name)中的name被当作常量而非字符串字面量,PHP 会触发Use of undefined constant name警告;正确写法是'name'(带引号); -
RSS 数据字段实际为 SimpleXMLElement 对象:
$i->title等返回的是SimpleXMLElement实例,需显式转为字符串(例如(string)$i->title),否则可能在XMLWriter::text()中引发类型异常。
以下是修正并优化后的完整实现:
<?php
$races = [
"Governor",
"1st District Representative in Congress",
"37th District State Senator",
"107th District Representative in State Legislature",
"108th District Representative in State Legislature",
"109th District Representative in State Legislature",
"110th District Representative in State Legislature"
];
function has_keywords($haystack, $wordlist): bool {
if (!is_string($haystack)) return false;
foreach ($wordlist as $w) {
if (stripos($haystack, $w) !== false) {
return true;
}
}
return false;
}
// 加载并解析 RSS
$rss = simplexml_load_file("https://mielections.us/election/results/RSS/2022PRI_MI_CENR_SUMMARY.rss");
if (!$rss) {
die("Failed to load RSS feed.");
}
$electionresults = [];
foreach ($rss->channel->item as $i) {
$title = (string)$i->title;
$description = (string)$i->description;
$category = (string)$i->category;
if (
has_keywords($title, $races) ||
has_keywords($description, $races) ||
has_keywords($category, $races)
) {
$electionresults[] = [
'title' => $title,
'description' => $description,
'link' => (string)$i->link
];
}
}
// 使用 XMLWriter 生成 XML 文件
$xml = new XMLWriter();
$xml->openURI('election-results.xml');
$xml->setIndent(true);
$xml->setIndentString(' ');
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('election');
foreach ($electionresults as $race) {
$xml->startElement('race');
$xml->startElement('title'); // 注意:字符串字面量,加单引号
$xml->text($race['title']);
$xml->endElement();
$xml->startElement('data'); // 同上
$xml->text($race['description']);
$xml->endElement();
$xml->endElement();
}
$xml->endElement(); // </election>
$xml->endDocument();
$xml->flush();
unset($xml);
echo "XML feed generated successfully: election-results.xml\n";
?>✅ 关键改进说明:
立即学习“PHP免费学习笔记(深入)”;
- 所有元素名(如
'title','data')均使用字符串字面量,避免常量未定义错误; - RSS 字段统一强制转换为字符串:
(string)$i->title,确保XMLWriter::text()接收有效输入; - 增加基础错误检查(如 RSS 加载失败判断),提升鲁棒性;
- 使用现代 PHP 类型声明(
bool返回类型)和简洁注释,增强可维护性。
⚠️ 注意事项:
- 确保服务器启用了
xmlwriter扩展(通常默认启用,可通过phpinfo()或extension_loaded('xmlwriter')验证); - 若 RSS 源不可达或格式异常,
simplexml_load_file()可能返回false,务必做空值检查; - 输出文件路径
election-results.xml须保证 PHP 进程具有写入权限; - 如需支持中文等 UTF-8 内容,请确认 RSS 源本身编码为 UTF-8,且 Web 服务器响应头未覆盖 XML 声明中的编码。
通过以上实现,你将获得结构清晰、合法合规的 XML 文件,可直接用于前端解析、第三方系统对接或静态数据分发。



















