非常に大きな (700MB) XML ファイルを読み取るために、XMLReader/SimpleXML ハイブリッド関数を作成しようとしています。XML の形式は次のとおりです。
<Items>
<Item>
<ItemKey>ABCDEF123</ItemKey>
<Name>
<English>An Item Name</English>
<German>An Item Name In German</German>
<French>An Item Name In French</French>
</Name>
<Description>
<English>An Item Description</English>
<German>An Item Description In German</German>
<French>An Item Description In French</French>
</Description>
</Item>
<Item>
<ItemKey>GHIJKL456</ItemKey>
<Name>
<English>Another Item Name</English>
<German>Another Item Name In German</German>
<French>Another Item Name In French</French>
</Name>
<Description>
<English>Another Item Description</English>
<German>Another Item Description In German</German>
<French>Another Item Description In French</French>
</Description>
</Item>
</Items>
これを行うためにこれまでに書いたコード:
$xml = new XMLReader();
if(!$xml->open('testitems.xml')){
die('Failed to open file!');
} else {
echo 'File opened';
}
$items = array();
while ($xml->read()){
if($xml->nodeType == XMLReader::ELEMENT){
if ($xml->name == 'Item'){
$item = array();
}
if ($xml->name == 'ItemKey'){
$xml->read();
$item['itemKey'] = $xml->value;
}
if ($xml->name == 'Name'){
$sxml = new SimpleXMLElement($xml->readOuterXml());
$englishName = $sxml->English;
$item['englishName'] = $englishName;
}
}
if($xml->nodeType == XMLReader::END_ELEMENT){
if ($xml->name == 'Item'){
$items[] = $item;
}
}
}
var_dump($items);
$xml->close();
ただし、ItemKey ノードの値が配列に挿入されている間、英語の名前は挿入されていないため、このノードに正しくアクセスできないようです。私はすべてに XMLReader を使用するだけですが、これまでのグーグルでは英語のノード (1 つは名前、もう 1 つは説明) が繰り返し出現するため、SimpleXML が前進する方法のように見えましたが、まだ喜びはありません。
助言がありますか?良いガイドはありますか?php.net の XMLReader ドキュメントは、他の多くの PHP 機能に比べてひどく不足しており、一般的に、明確で簡潔な詳細なガイドを見つけるのは難しいようです。