請求範例:
<?xml version="1.0"?>
<methodCall>
<methodName>sqrt</methodName>
<params>
<param>
<value><double>36.0</double></value>
</param>
</params>
</methodCall>
需求:驗證 methodName 為 sqrt,取得 double 參數,回傳平方根。
$reader = new XMLReader();
$request = $HTTP_RAW_POST_DATA; // 或 file_get_contents('php://input')
$reader->XML($request); // 解析字串
// 或 $reader->open('https://example.com/feed.xml'); // 解析遠端/本地檔案
<?php
function process_xmlrpc($reader) {
// 移至 methodCall
$reader->read();
$reader->read(); // methodName
$method = $reader->readString();
if ($method !== 'sqrt') {
return xmlrpc_error('Unsupported method');
}
// 移至 params/param/value/double
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'double') {
$value = (float)$reader->readString();
break;
}
}
$result = sqrt($value);
return xmlrpc_response($result);
}
function xmlrpc_response($val) {
return '<?xml version="1.0"?><methodResponse><params><param><value><double>' . $val . '</double></value></param></params></methodResponse>';
}
| 方法 | 說明 |
|---|---|
read() | 移至下一個節點,成功返回 true |
readString() | 讀取當前元素的文字內容 |
readOuterXml() | 讀取當前節點含標籤的完整 XML |
readInnerXml() | 讀取當前節點內部 XML |
moveToAttribute($name) | 移至指定屬性 |
nodeType | 常數:ELEMENT, TEXT, ATTRIBUTE, END_ELEMENT 等 |
name | 當前節點名稱 |
depth | 節點深度 |