Caveat!
It took me almost an hour to figure this out, so I hope it saves at least one of you some time.
If you want to debug your DOM tree and try var_dump() or similar you will be fooled into thinking the DOMElement that you are looking at is empty, because var_dump() says: object(DOMElement)#1 (0) { }
After much debugging I found out that all DOM objects are invisible to var_dump() and print_r(), my guess is because they are C objects and not PHP objects. So I tried saveXML(), which works fine on DOMDocument, but is not implemented on DOMElement.
The solution is simple (if you know it):
$xml = $domElement->ownerDocument->saveXML($domElement);
This will give you an XML representation of $domElement.
DOMElement クラス
クラス概要
DOMElement
DOMElement
extends
DOMNode
{
/* プロパティ */
/* メソッド */
__construct
( string $name
[, string $value
[, string $namespaceURI
]] )
/* 継承されたメソッド */
}プロパティ
- schemaTypeInfo
-
未実装。常に NULL を返す。
- tagName
-
要素名
目次
- DOMElement::__construct — 新しい DOMElement オブジェクトを作成する
- DOMElement::getAttribute — 属性の値を返す
- DOMElement::getAttributeNode — 属性ノードを返す
- DOMElement::getAttributeNodeNS — 属性ノードを返す
- DOMElement::getAttributeNS — 属性の値を返す
- DOMElement::getElementsByTagName — タグ名から要素を取得する
- DOMElement::getElementsByTagNameNS — 名前空間 URI とローカル名から要素を取得する
- DOMElement::hasAttribute — 属性が存在するかどうかを調べる
- DOMElement::hasAttributeNS — 属性が存在するかどうかを調べる
- DOMElement::removeAttribute — 属性を削除する
- DOMElement::removeAttributeNode — 属性を削除する
- DOMElement::removeAttributeNS — 属性を削除する
- DOMElement::setAttribute — 新しい属性を追加する
- DOMElement::setAttributeNode — 新しい属性ノードを要素に追加する
- DOMElement::setAttributeNodeNS — 新しい属性ノードを要素に追加する
- DOMElement::setAttributeNS — 新しい属性を追加する
- DOMElement::setIdAttribute — ID 型の属性を名前で宣言する
- DOMElement::setIdAttributeNode — ID 型の属性をノードで宣言する
- DOMElement::setIdAttributeNS — ID 型の属性をローカル名および名前空間 URI で宣言する
DOMElement
j DOT wagner ( AT ) medieninnovation.com
08-Oct-2008 06:11
08-Oct-2008 06:11
Severin
14-Sep-2008 03:18
14-Sep-2008 03:18
I wanted to find similar Elements - thats why I built an Xpath-String like this - maybe somebody needs it... its not very pretty - but neither is domdocument :)
<?php
$dom->load($xmlFile))
$xpathQuery = '//*';
$xmlNodes = $xpath->query($xpathQuery);
$pathlist = array();
$attrlist = array();
foreach ($xmlNodes as $node) {
$depth = $this->_getDomDepth($node); //get Path-Depth (for array key)
$pathlist[$depth] = $node->tagName; // tagname
$attrs = $node->attributes;
$attr='';
$a=0;
foreach ($attrs as $attrName => $attrNode) // attributes
{
if ($attrName !='reg')
{
if ($a++!=0) $attr .= ' and ';
$attr .= '@'.$attrName.'='."'".$attrNode->value."'";
}
}
$attrlist[$depth] = $attr?'['.$attr.']':'';
$path = ''; for ($i=0;$i<=$depth;$i++) $path .= '/'.$pathlist[$i].$attrlist[$i]; // the xpath of the actual Element
// ... now you can go on and user $path to find similar elements
}
}
}
private function _getDomDepth(DomNode $node)
{
$r = -2;
while ($node) {
$r++;
$node = $node->parentNode;
}
return $r;
}
?>
ae.fxx
18-Jul-2008 10:49
18-Jul-2008 10:49
Hi there.
Remember to append a DOMNode (or any of its descendants) to a DOMDocument __BEFORE__ you try to append a child to it.
I don't know why it has to be this way but it can't be done without it.
bye
