SVGをDOMでgetElementByIdするとnullになる

PHPでSVGを処理するときに、DOMDocumentオブジェクトのgetElementById()で目的の要素を取得しようとしたけど、nullになってしまってかなりはまりました。。。

結局のところ、SVGの仕様(DTD)としてid属性は宣言されていないので、idと書いてもID(識別子)として機能してくれません。
だからgetElementByIdでは取得できない。
ということのようでした。

じゃぁ、どうするか。なんだけど、PHPのDOMDocumentにはsetIdAttributeという関数があって、これがDOMにこの属性はIDだよ!って教えてくれて、getElementByIdで取得できるようになります。

PHPマニュアルにサンプルがありました。

全ての要素に定義されたidをIDとして登録するコードで、自分自身を再帰的に呼び出すことでツリー構造に対応しています。

function setAllId($DOMNode){
  if($DOMNode->hasChildNodes()){
    foreach ($DOMNode->childNodes as $DOMElement) {
      if($DOMElement->hasAttributes()){
        $id=$DOMElement->getAttribute("id");
        if($id){
          $DOMElement->setIdAttribute("id",$id);
        }
      }
      setAllId($DOMElement);
    }
  }
カテゴリー: PHP