
本文介绍如何利用 PHP 的 XMLWriter 类,将过滤后的 RSS 数据数组转换为符合要求的 XML 格式(如包含 等嵌套结构),重点解决因误用对象访问语法($race->title)导致的运行错误,并提供健壮、可扩展的实现方案。
本文介绍如何利用 php 的 xmlwriter 类,将过滤后的 rss 数据数组转换为符合要求的 xml 格式(如包含 `
在 PHP 中,将关联数组安全、高效地序列化为 XML,推荐使用内置的 XMLWriter 扩展——它内存占用低、性能好,且能精确控制缩进与编码。你遇到的核心问题在于:$electionresults 是一个索引数组,每个元素是关联数组(如 ['title' => 'Governor', 'description' => 'Name 500 23%']),但原始代码中错误地使用了对象属性访问语法 $race->title,导致 Fatal error: Cannot use object of type stdClass as array 或空值输出。
以下是修正后的完整、生产就绪的实现:
<?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 === false) {
die("Failed to load RSS feed.");
}
$electionresults = [];
foreach ($rss->channel->item as $item) {
$title = (string)$item->title;
$desc = (string)$item->description;
$category = (string)$item->category;
if (has_keywords($title, $races) ||
has_keywords($desc, $races) ||
has_keywords($category, $races)) {
$electionresults[] = [
'title' => $title,
'description' => $desc,
'link' => (string)$item->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');
// 正确访问关联数组键:$race['title'](非 $race->title)
$xml->startElement('title');
$xml->text(htmlspecialchars($race['title'], ENT_XML1, 'UTF-8'));
$xml->endElement();
$xml->startElement('data');
$xml->text(htmlspecialchars($race['description'], ENT_XML1, 'UTF-8'));
$xml->endElement();
$xml->endElement(); //
}
$xml->endElement(); //
$xml->endDocument();
$xml->flush();
echo "✅ XML feed generated successfully: election-results.xml\n";
unset($xml);
?>
关键修正与最佳实践说明:
- ✅ 数组访问正确性:
$race['title']替代$race->title,因$electionresults是array[]而非SimpleXMLElement[]; - ✅ 字符串强制转换与空值防护:对
$item->title等 SimpleXML 元素显式转为(string),避免__toString()不确定行为; - ✅ XSS 安全防护:使用
htmlspecialchars(..., ENT_XML1, 'UTF-8')对内容转义,确保生成的 XML 符合规范(如→ <code>),防止非法字符破坏结构; - ✅ 健壮性增强:添加 RSS 加载失败判断、
has_keywords中对非字符串输入的防御; - ⚠️ 注意事项:
XMLWriter::openURI()需确保 PHP 进程有写入目标目录的权限;若需输出到浏览器,请改用openMemory()+outputMemory(); - ? 可扩展建议:如需添加
<link>或其他字段,只需在foreach内追加对应startElement()块即可,结构清晰易维护。
该方案生成的 XML 严格符合你的预期格式:
<election><race><title>Governor</title> <data>Name 500 23%</data></race><!-- 更多 race --></election>
执行后,election-results.xml 将被创建于脚本同级目录,可直接用于前端解析或第三方系统集成。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











