I want to convert a DOMNode
object from a call to getElementsByTagName()
to a DOMElement
in order to access methods like getElementsByTagName()
on the child element. In any other language, I would cast and it would be easy, but after some quick looking, PHP does not have object casting. So what I need to know is how to get a DOMElement
object from a DOMNode
object.
$dom = new DOMDocument('1.0', 'utf-8'); $element = $dom->createElement('foo', 'me & you');
Dom parser travels based on tree based and before access the data, it will load the data into dom object and it will update the data to the web browser. Below Example shows how to get access to the HTML data in web browser. <? $cols->item(0)->nodeValue.
So if you're ever working with the content for a post (a post type or a custom post type, for that matter) and you need to manipulate tags much like you would with JavaScript, then using the DomDocument library is one of the most powerful tools are your disposal.
The DOMDocument::getElementsByTagName() function is an inbuilt function in PHP which is used to return a new instance of class DOMNodeList which contains all the elements of local tag name.
You don't need to cast anything, just call the method:
$links = $dom->getElementsByTagName('a');
foreach ($links as $link) {
$spans = $link->getElementsByTagName('span');
}
And by the way, DOMElement
is a subclass of DOMNode
. If you were talking about a DOMNodeList
, then accessing the elements in such a list can be done, be either the method presented above, with a foreach()
loop, either by using the item()
method of DOMNodeList
:
$link_0 = $dom->getElementsByTagName('a')->item(0);
This is what I use in my project to minimize IDE warning.
/**
* Cast a DOMNode into a DOMElement
*/
function cast_e(DOMNode $node) : DOMElement {
if ($node) {
if ($node->nodeType === XML_ELEMENT_NODE) {
return $node;
}
}
return null;
}
You don't need to do any explicit typecasting, just check if your DOMNode object has a nodeType of XML_ELEMENT_NODE
.
PHP will be perfectly happy with this.
If you use PHPLint to check your code you will notice that PHPLint complains about using getElementsByTagName
on a DOMNode object. To get around this you need to jump through the following hoop:
/*.object.*/ $obj = $node;
$element = /*.(DOMElement).*/ $obj;
Then you will have a $element variable of the correct type and no complaints from PHPLint.
I know this is mostly an annoying IDE problem.
The reason is $DOMNodeList->item(0)
witch returns a DOMNode ( or at least the IDE thinks so ).
To fix this you will have to Extract out the $DOMDocument->getElementsByTagName( $tagName )->item($index)
into a method of its own. In the DOCBlock you set the @return statement to DOMElement witch fixes the inspection problem.
This Works at least in PHPStorm.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With