simplexmlで「:(コロン)」や「-(ハイフン)」などの特殊文字が入ったノードを処理する方法

<Response>
 <Header-a>
  <Args>ああ</Args>
 </Header-a>
 <Body>
  <booksTotalSearch:BooksTotalSearch>
   <count>14</count>
    ・
    ・

上記のようなxmlがあったとします。

ここで、

$xml = simplexml_load_string( $xmltxt ); ($xmltxtには上記xmlが入っているものとする)

とし、

$xml->Header-a

とすると「なんか変な - があるよ!」と怒られてしまいます。

こういう場合は、

$xml->{"Header-a"}

というように囲ってやればOK!参考→http://634.ayumu-baby.com/pukiwiki/index.php?PHP/SimpleXML

$xml->Body->booksTotalSearch:BooksTotalSearch

の場合もどうように怒られますが、これはちょっと勝手が違います。「:」はxml名前空間を表しているものなので
{}で囲ってやってもダメです。

この場合は、

$xml->registerXPathNamespace('booksTotalSearch', 'http://api.rakuten.co.jp/rws/rest/BooksTotalSearch/2009-04-15');

のように、名前空間を登録してやり、
※ブラウザでxmlを見ていると名前空間URIが表示されていない場合があります。ブラウザのソースを表示させ、ヘッダーの部分を見ましょう

$booksTotalSearch = $xml->xpath('//booksTotalSearch:BooksTotalSearch');
$booksTotalSearch[0]->count

とすることでアクセス可能です。

※registerXPathNamespace()は古いバージョンのphpにはありません