SimpleXML、XPath、およびfor-eachループを使用すると、これを非常に簡単に行うことができます。
SimpleXMLオブジェクトで覚えておくべきことがいくつかあります。
- 各要素は
SimpleXMLElement
SimpleXMLElement
配列表記を使用してaの属性にアクセスします(例Element['attributeName']
:)
- オブジェクト表記(例、
Element->ChildElements
またはElement->{Child-Element-With-Strange-Name}
)を使用して特定の名前の子要素にアクセスする
(string) Element
テキスト値(例または(string) Element['attribute']
)を取得するには、常に文字列にキャストします
- より洗練されたクエリの場合は、この
xpath
メソッドを使用します。
- 名前空間のある要素にアクセスするには、
children
メソッドの最初の引数を使用します。
一般に、中程度のサイズのデータ構造化(対ドキュメント構造化)XMLがある場合は常に、抵抗が最小のパスはですSimpleXML
。非常に大きなドキュメントがある場合は、の組み合わせを使用しXMLReader
てドキュメントをチャンクに分割し、またはXMLReader::expand()
を使用してそれらのチャンクを処理します。DOMDocument
SimpleXML
次の関数は、必要なデータを構造化配列に抽出します。
function extractDataFromFeed($feeduri) {
$events = array();
$sxe = simplexml_load_file($feeduri);
$targetMasterEvents = $sxe->xpath('/EventData/MasterEvents[starts-with(./@TopLevelName, "NRL Round ")]');
foreach ($targetMasterEvents as $targetMasterEvent) {
foreach ($targetMasterEvent->Event as $targetEvent) {
$event = array(
'EventUrl' => (string) $targetEvent['EventURL'],
'Competitors' => array(), // CompetitorName => StraightBetPrice,
// (assumes 1 price per competitorname)
);
foreach ($targetEvent->Competitors as $targetCompetitor) {
$targetBets = $targetCompetitor->xpath('BetType[@BetTypeName="Straight Bet"]');
foreach ($targetBets as $targetBet) {
$event['Competitors'][(string) $targetCompetitor['CompetitorName']]
= (string) $targetBet['Price'];
}
}
}
$events[] = $event;
}
return $events;
}
$FEED = 'http://xmlfeeds.centrebet.com/xmlRugbyLeaguefeed.xml';
$events = extractDataFromFeed($FEED);
var_export($events);
ここから、このデータをデータベースに挿入するのは簡単です(以下のコードはテストされていません)。
function insertEvents($eventname, $events, PDO $pdo) {
// Set exception mode (if not set already)
$old_ERRMODE = $pdo->getAttribute(PDO::ATTR_ERRMODE);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// create prepared statements
$insertEvent = $pdo->prepare('INSERT INTO events (EventName, EventURL) VALUES (?,?)');
$insertBet = $pdo->prepare('INSERT INTO bets (event_id, CompetitorName, Price) VALUES (?,?,?)');
// bind statement parameters
$insertEvent->bindValue(1, $eventName, PDO::PARAM_STR);
$insertEvent->bindParam(2, $eventURL, PDO::PARAM_STR);
$insertBet->bindParam(1, $event_id, PDO::PARAM_INT);
$insertBet->bindParam(2, $competitorName, PDO::PARAM_STR);
$insertBet->bindParam(3, $price);
// loop through event array, executing inserts
foreach($events as $event) {
$eventUrl = $event['EventURL'];
$insertEvent->execute();
$event_id = $pdo->lastInsertId();
foreach($event['Competitors'] as $competitorName => $price) {
$insertBet->execute();
}
}
// restore ERRMODE setting (won't be restored if exception is raised!)
$pdo->setAttribute(PDO::ATTR_ERRMODE, $old_ERRMODE);
}