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