Kotchasan Framework Documentation

Kotchasan Framework Documentation

DOMNode

EN 05 Feb 2026 07:48

DOMNode

\Kotchasan\DOMNode represents a node in the DOM structure.

Creation

DOMNodes are typically created by DOMParser, but can be instantiated manually.

use Kotchasan\DOMNode;

// Create new element node
$node = new DOMNode(
    'DIV',           // nodeName
    null,            // parentNode
    ['class' => 'container'],  // attributes
    null             // nodeValue (for text node)
);

// Create text node
$textNode = new DOMNode('', $parentNode, [], 'Hello World');

Constructor

$node = new DOMNode($nodeName, $parentNode, $attributes, $nodeValue = null);
Parameter Type Description
$nodeName string Tag name (e.g., DIV, P). Empty for text nodes.
$parentNode DOMNode/null Parent node
$attributes array HTML attributes
$nodeValue string/null Value for text node

Properties

nodeName

Tag name (uppercase).

echo $node->nodeName;  // "DIV", "P", "SPAN"

// Text node has empty nodeName
if ($node->nodeName === '') {
    echo "This is a text node";
}

nodeValue

Value of text node.

// For text node
echo $node->nodeValue;  // "Hello World"

// For element node, it is null

attributes

Array of HTML attributes (keys are uppercase).

$node->attributes['CLASS'];  // "container"
$node->attributes['ID'];     // "main"
$node->attributes['HREF'];   // "https://..."

parentNode

Reference to parent node.

if ($node->parentNode !== null) {
    echo "Parent: " . $node->parentNode->nodeName;
}

childNodes

Array of child nodes.

foreach ($node->childNodes as $child) {
    echo $child->nodeName . "\n";
}

previousSibling / nextSibling

Sibling nodes.

// Previous sibling
if ($node->previousSibling) {
    echo "Previous: " . $node->previousSibling->nodeName;
}

// Next sibling
if ($node->nextSibling) {
    echo "Next: " . $node->nextSibling->nodeName;
}

Methods

hasChildNodes()

Check if node has children.

if ($node->hasChildNodes()) {
    echo "Has " . count($node->childNodes) . " children";
}

hasClass()

Check if node has a specific CSS class.

if ($node->hasClass('active')) {
    echo "Node has class 'active'";
}

if ($node->hasClass('container')) {
    // ...
}

isInlineElement()

Check if node is an inline element.

if ($node->isInlineElement()) {
    echo "Inline element";
} else {
    echo "Block element";
}

Inline elements:
B, BIG, I, SMALL, TT, ABBR, ACRONYM, CITE, CODE, DFN, EM, STRONG, SAMP, TIME, VAR, A, BDO, BR, IMG, MAP, OBJECT, Q, SCRIPT, SPAN, SUB, BUTTON, INPUT, LABEL, SELECT, TEXTAREA

nodeText()

Get text content of node and all descendants.

$html = '<div><p>Hello</p><p>World</p></div>';
$parser = new DOMParser($html);
$div = $parser->nodes()[0];

echo $div->nodeText();  // "HelloWorld"

unentities()

Convert HTML entities to characters.

$text = $node->unentities('Hello&nbsp;World&amp;More');
// "Hello World&More"

Supported entities:

  • &nbsp;
  • &amp;&
  • &lt;<
  • &gt;>
  • &#39;'
  • &quot;"

Usage Examples

Traverse DOM Tree

function traverse($node, $callback, $depth = 0) {
    $callback($node, $depth);

    foreach ($node->childNodes as $child) {
        traverse($child, $callback, $depth + 1);
    }
}

$parser = new DOMParser('<div><p>Hello</p></div>');
foreach ($parser->nodes() as $node) {
    traverse($node, function($n, $d) {
        $indent = str_repeat('  ', $d);
        echo $indent . ($n->nodeName ?: 'TEXT') . "\n";
    });
}

Find Elements by Class

function findByClass($node, $className, &$results = []) {
    if ($node->hasClass($className)) {
        $results[] = $node;
    }

    foreach ($node->childNodes as $child) {
        findByClass($child, $className, $results);
    }

    return $results;
}

$parser = new DOMParser('<div class="item">1</div><div class="item">2</div>');
$items = [];
foreach ($parser->nodes() as $node) {
    findByClass($node, 'item', $items);
}

echo count($items) . " items found";  // 2
function extractLinks($node, &$links = []) {
    if ($node->nodeName === 'A' && isset($node->attributes['HREF'])) {
        $links[] = $node->attributes['HREF'];
    }

    foreach ($node->childNodes as $child) {
        extractLinks($child, $links);
    }

    return $links;
}

$html = '<a href="/page1">Link 1</a><a href="/page2">Link 2</a>';
$parser = new DOMParser($html);

$links = [];
foreach ($parser->nodes() as $node) {
    extractLinks($node, $links);
}

print_r($links);
// ['/page1', '/page2']