前端下拉選單選擇歌手,AJAX 請求 PHP 解析 XML 專輯目錄,回傳該歌手的專輯詳細資訊。示範 DOMDocument 針對 XML 進行查詢與輸出。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>AJAX XML 範例</title>
<script>
function showCD(str) {
const box = document.getElementById('txtHint');
if (!str) {
box.innerHTML = '';
return;
}
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
box.innerHTML = xhr.responseText;
}
};
xhr.open('GET', 'getcd.php?q=' + encodeURIComponent(str), true);
xhr.send();
}
</script>
</head>
<body>
<form>
Select a CD:
<select name="cds" onchange="showCD(this.value)">
<option value="">Select a CD:</option>
<option value="Bob Dylan">Bob Dylan</option>
<option value="Bee Gees">Bee Gees</option>
<option value="Cat Stevens">Cat Stevens</option>
</select>
</form>
<br>
<div id="txtHint"><b>CD info will be listed here...</b></div>
</body>
</html>
<?php
$q = isset($_GET['q']) ? $_GET['q'] : '';
if (!$q) exit;
$doc = new DOMDocument();
if (!$doc->load('cd_catalog.xml')) {
exit('無法載入 XML');
}
$artists = $doc->getElementsByTagName('ARTIST');
$found = null;
for ($i = 0; $i < $artists->length; $i++) {
$artist = $artists->item($i);
if ($artist->nodeType === XML_ELEMENT_NODE) {
$name = $artist->childNodes->item(0)->nodeValue;
if ($name === $q) {
$found = $artist->parentNode; // 取得父節點 (CD 節點)
break;
}
}
}
if ($found) {
foreach ($found->childNodes as $node) {
if ($node->nodeType === XML_ELEMENT_NODE) {
echo "<b>{$node->nodeName}:</b> {$node->childNodes->item(0)->nodeValue}<br>";
}
}
}
?>
<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Bee Gees</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Polydor</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
</CATALOG>
onchange 送出歌手名稱 q。<ARTIST> 節點。<CD>),輸出所有子元素名稱與值。DOMXPath 簡化搜尋:$xpath->query("//CD[ARTIST='$q']") (需注意注入,建議參數化或過濾)。<CD> 節點。fetch(),回傳 JSON 而非 HTML 片段,前端自行渲染。