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); } }