原文採用 str_replace('xxx:', '', $xml) 暴力去除命名空間前綴,雖能「跑通」但破壞 XML 結構語義,且極其脆弱。本文展示 SimpleXML 原生支持命名空間的正確用法。
<?xml version="1.0"?>
<root xmlns:xxx="https://example.com/ns">
<xxx:title>芒果小站</xxx:title>
<xxx:content>內容</xxx:content>
</root>
xxx:id)同樣被破壞。$xmlString = '...'; // 上述 XML
$xml = simplexml_load_string($xmlString);
// 註冊命名空間前綴 → URI 映射
$xml->registerXPathNamespace('ns', 'https://example.com/ns');
// 使用前綴查詢
$titles = $xml->xpath('//ns:title');
foreach ($titles as $title) {
echo (string)$title . "\n"; // 輸出: 芒果小站
}
// 獲取屬性
$items = $xml->xpath('//ns:item');
foreach ($items as $item) {
$id = (string)$item->attributes('ns', true)->id; // 訪問 ns:id 屬性
echo "ID: $id\n";
}
$namespaces = $xml->getNamespaces(true); // true 遞歸獲取所有層級
foreach ($namespaces as $prefix => $uri) {
$xml->registerXPathNamespace($prefix, $uri);
}
// 現在可用所有前綴查詢
$allTitles = $xml->xpath('//*[local-name()="title"]'); // 或遍歷各前綴
| 維度 | str_replace 暴力去除 | registerXPathNamespace |
|---|---|---|
| XML 合法性 | 破壞 | 保持 |
| 同名元素區分 | 不可區分 | 精準區分 |
| 屬性命名空間 | 破壞 | 正常訪問 |
| 代碼健壯性 | 極低 | 高 |
| 性能 | 全文掃描替換 | 原生解析器優化 |
原則:永遠使用解析器原生的命名空間機制,不要用字符串操作處理結構化數據。SimpleXML 已完整支持 XPath 1.0 + 命名空間,足夠應對 99% 場景。