PHP 7.2.0 Release Candidate 4 Released

DOMNode sınıfı

(PHP 5, PHP 7)

Sınıf Sözdizimi

DOMNode {
/* Özellikler */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode $firstChild ;
public readonly DOMNode $lastChild ;
public readonly DOMNode $previousSibling ;
public readonly DOMNode $nextSibling ;
public readonly DOMNamedNodeMap $attributes ;
public readonly DOMDocument $ownerDocument ;
public readonly string $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string $baseURI ;
public string $textContent ;
/* Yöntemler */
DOMNode appendChild ( DOMNode $yeni )
public string C14N ([ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes ]]]] )
public int C14NFile ( string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes ]]]] )
DOMNode cloneNode ([ bool $torunlar_dahil = TRUE ] )
public int getLineNo ( void )
public string getNodePath ( void )
bool hasAttributes ( void )
bool hasChildNodes ( void )
DOMNode insertBefore ( DOMNode $yeni [, DOMNode $mevcut ] )
bool isDefaultNamespace ( string $uri )
bool isSameNode ( DOMNode $düğüm )
bool isSupported ( string $özellik , string $sürüm )
string lookupNamespaceURI ( string $önek )
string lookupPrefix ( string $uri )
void normalize ( void )
DOMNode removeChild ( DOMNode $eski )
DOMNode replaceChild ( DOMNode $yeni , DOMNode $eski )
}

Özellikler

nodeName

Geçerli düğüm türü için en doğru ismi döndürür.

nodeValue

Düğümün türüne bağlı olarak düğümün değeri.

nodeType

XML_xxx_NODE sabitlerinden biri olarak düğüm türü.

parentNode

Düğümün ebeveyni.

childNodes

Düğümün tüm çocuklarını içeren bir DOMNodeList nesnesi; düğüm çocuksuzsa boş bir DOMNodeList nesnesidir.

firstChild

Düğümün ilk çocuğu; yoksa NULL'dur.

lastChild

Düğümün son çocuğu; yoksa NULL'dur.

previousSibling

Bir önceki kardeş düğüm; yoksa NULL'dur.

nextSibling

Bir sonraki kardeş düğüm; yoksa NULL'dur.

attributes

Düğüm bir DOMElement nesnesi ise düğümün özniteliklerini içeren bir DOMNamedNodeMap nesnesi, yoksa NULL'dur.

ownerDocument

Düğümün ait olduğu DOMDocument nesnesi.

namespaceURI

Belirtilmişse düğümün isim alanını betimleyen adres; yoksa NULL'dur.

prefix

Belirtilmişse düğümün isim alanı öneki; yoksa NULL'dur.

localName

Düğümün nitelikli isminin yerel kısmı.

baseURI

Düğümün mutlak adresi; eğer gerçeklenim bir mutlak adres sağlayamıyorsa NULL'dur.

textContent

Düğümün kendinin, çocuk ve torunlarının metin içeriği.

İçindekiler

add a note add a note

User Contributed Notes 13 notes

up
16
marc at ermshaus dot org
8 years ago
It took me forever to find a mapping for the XML_*_NODE constants. So I thought, it'd be handy to paste it here:

1 XML_ELEMENT_NODE
2 XML_ATTRIBUTE_NODE
3 XML_TEXT_NODE
4 XML_CDATA_SECTION_NODE
5 XML_ENTITY_REFERENCE_NODE
6 XML_ENTITY_NODE
7 XML_PROCESSING_INSTRUCTION_NODE
8 XML_COMMENT_NODE
9 XML_DOCUMENT_NODE
10 XML_DOCUMENT_TYPE_NODE
11 XML_DOCUMENT_FRAGMENT_NODE
12 XML_NOTATION_NODE
up
14
David Rekowski
7 years ago
You cannot simply overwrite $textContent, to replace the text content of a DOMNode, as the missing readonly flag suggests. Instead you have to do something like this:

<?php

$node
->removeChild($node->firstChild);
$node->appendChild(new DOMText('new text content'));

?>

This example shows what happens:

<?php

$doc
= DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
echo
"Content 1: ".$node->textContent."\n";

$node->textContent = 'new content';
echo
"Content 2: ".$node->textContent."\n";

$newText = new DOMText('new content');

$node->appendChild($newText);
echo
"Content 3: ".$node->textContent."\n";

$node->removeChild($node->firstChild);
$node->appendChild($newText);
echo
"Content 4: ".$node->textContent."\n";

?>

The output is:

Content 1: old content // starting content
Content 2: old content // trying to replace overwriting $node->textContent
Content 3: old contentnew content // simply appending the new text node
Content 4: new content // removing firstchild before appending the new text node

If you want to have a CDATA section, use this:

<?php
$doc
= DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
$node->removeChild($node->firstChild);
$newText = $doc->createCDATASection('new cdata content');
$node->appendChild($newText);
echo
"Content withCDATA: ".$doc->saveXML($node)."\n";
?>
up
7
R. Studer
7 years ago
For clarification:
The assumingly 'discoverd' by previous posters and seemingly undocumented methods (.getElementsByTagName and .getAttribute) on this class (DOMNode) are in fact methods of the class DOMElement, which inherits from DOMNode.

See: http://www.php.net/manual/en/class.domelement.php
up
5
brian wildwoodassociates.info
8 years ago
This class has a getAttribute method.

Assume that a DOMNode object $ref contained an anchor taken out of a DOMNode List.  Then

    $url = $ref->getAttribute('href');

would isolate the url associated with the href part of the anchor.
up
3
alastair dot dallas at gmail dot com
6 years ago
The issues around mixed content took me some experimentation to remember, so I thought I'd add this note to save others time.

When your markup is something like: <div><p>First text.</p><ul><li><p>First bullet</p></li></ul></div>, you'll get XML_ELEMENT_NODEs that are quite regular. The <div> has children <p> and <ul> and the nodeValue for both <p>s yields the text you expect.

But when your markup is more like <p>This is <b>bold</b> and this is <i>italic</i>.</p>, you realize that the nodeValue for XML_ELEMENT_NODEs is not reliable. In this case, you need to look at the <p>'s child nodes. For this example, the <p> has children: #text, <b>, #text, <i>, #text.

In this example, the nodeValue of <b> and <i> is the same as their #text children. But you could have markup like: <p>This <b>is bold and <i>bold italic</i></b>, you see?</p>. In this case, you need to look at the children of <b>, which will be #text, <i>, because the nodeValue of <b> will not be sufficient.

XML_TEXT_NODEs have no children and are always named '#text'. Depending on how whitespace is handled, your tree may have "empty" #text nodes as children of <body> and elsewhere.

Attributes are nodes, but I had forgotten that they are not in the tree expressed by childNodes. Walking the full tree using childNodes will not visit any attribute nodes.
up
1
metanull
3 years ago
Yet another DOMNode to php array conversion function.
Other ones on this page are generating too "complex" arrays; this one should keep the array as tidy as possible.
Note: make sure to set LIBXML_NOBLANKS when calling DOMDocument::load, loadXML or loadHTML
See: http://be2.php.net/manual/en/libxml.constants.php
See: http://be2.php.net/manual/en/domdocument.loadxml.php

<?php
        
/**
         * Returns an array representation of a DOMNode
         * Note, make sure to use the LIBXML_NOBLANKS flag when loading XML into the DOMDocument
         * @param DOMDocument $dom
         * @param DOMNode $node
         * @return array
         */
       
function nodeToArray( $dom, $node) {
            if(!
is_a( $dom, 'DOMDocument' ) || !is_a( $node, 'DOMNode' )) {
                return
false;
            }
           
$array = false;
            if( empty(
trim( $node->localName ))) {// Discard empty nodes
               
return false;
            }
            if(
XML_TEXT_NODE == $node->nodeType ) {
                return
$node->nodeValue;
            }
            foreach (
$node->attributes as $attr) {
               
$array['@'.$attr->localName] = $attr->nodeValue;
            }
            foreach (
$node->childNodes as $childNode) {
                if (
1 == $childNode->childNodes->length && XML_TEXT_NODE == $childNode->firstChild->nodeType ) {
                   
$array[$childNode->localName] = $childNode->nodeValue;
                }  else {
                    if(
false !== ($a = self::nodeToArray( $dom, $childNode))) {
                       
$array[$childNode->localName] =     $a;
                    }
                }
            }
            return
$array;
        }
?>
up
1
imranomar at gmail dot com
6 years ago
Just discovered that node->nodeValue strips out all the tags
up
1
pizarropablo at gmail dot com
3 years ago
In response to: alastair dot dallas at gmail dot com about "#text" nodes.
"#text" nodes appear when there are spaces or new lines between end tag and next initial tag.

Eg "<data><age>10</age>[SPACES]<other>20</other>[SPACES]</data>"

"data" childNodes has 4 childs:
- age = 10
- #text = spaces
- other = 20
- #text =  spaces
up
0
matej dot golian at gmail dot com
4 years ago
Here is a little function that truncates a DomNode to a specified number of text characters. I use it to generate HTML excerpts for my blog entries.

<?php

function makehtmlexcerpt(DomNode $html, $excerptlength)
{
$remove = 0;
$htmllength = strlen(html_entity_decode($html->textContent, ENT_QUOTES, 'UTF-8'));
$truncate = $htmllength - $excerptlength;
if(
$htmllength > $excerptlength)
{
if(
$html->hasChildNodes())
{
$children = $html->childNodes;
for(
$counter = 0; $counter < $children->length; $counter ++)
{
$child = $children->item($children->length - ($counter + 1));
$childlength = strlen(html_entity_decode($child->textContent, ENT_QUOTES, 'UTF-8'));
if(
$childlength <= $truncate)
{
$remove ++;
$truncate = $truncate - $childlength;
}
else
{
$child = makehtmlexcerpt($child, $childlength - $truncate);
break;
}
}
if(
$remove != 0)
{
for(
$counter = 0; $counter < $remove; $counter ++)
{
$html->removeChild($html->lastChild);
}
}
}
else
{
if(
$html->nodeName == '#text')
{
$html->nodeValue = substr(html_entity_decode($html->nodeValue, ENT_QUOTES, 'UTF-8'), 0, $htmllength - $truncate);
}
}
}
return
$html;
}

?>
up
-1
zlk1214 at gmail dot com
1 year ago
A function that can set the inner HTML without encoding error. $html can be broken content such as "<a ID=id20>ssss"
function setInnerHTML($node, $html) {
    removeChildren($node);
    if (empty($html)) {
        return;
    }
  
    $doc = $node->ownerDocument;
    $htmlclip = new DOMDocument();
    $htmlclip->loadHTML('<meta http-equiv="Content-Type" content="text/html;charset=utf-8"><div>' . $html . '</div>');
    $clipNode = $doc->importNode($htmlclip->documentElement->lastChild->firstChild, true);
    while ($item = $clipNode->firstChild) {
        $node->appendChild($item);
    }
}
up
0
Steve K
7 years ago
This class apparently also has a getElementsByTagName method.

I was able to confirm this by evaluating the output from DOMNodeList->item() against various tests with the is_a() function.
up
0
matt at lamplightdb dot co dot uk
8 years ago
And apparently also a setAttribute method too:

$node->setAttribute( 'attrName' , 'value' );
up
-6
I. Cook
7 years ago
For a reference with more information about the XML DOM node types, see http://www.w3schools.com/dom/dom_nodetype.asp

(When using PHP DOMNode, these constants need to be prefaced with "XML_")
To Top