DOM
在线手册:中文 英文
PHP手册

The DOMElement class

(PHP 5)

类摘要

DOMElement extends DOMNode {
/* 属性 */
readonly public bool $schemaTypeInfo ;
readonly public string $tagName ;
/* 方法 */
__construct ( string $name [, string $value [, string $namespaceURI ]] )
string getAttribute ( string $name )
DOMAttr getAttributeNode ( string $name )
DOMAttr getAttributeNodeNS ( string $namespaceURI , string $localName )
string getAttributeNS ( string $namespaceURI , string $localName )
DOMNodeList getElementsByTagName ( string $name )
DOMNodeList getElementsByTagNameNS ( string $namespaceURI , string $localName )
bool hasAttribute ( string $name )
bool hasAttributeNS ( string $namespaceURI , string $localName )
bool removeAttribute ( string $name )
bool removeAttributeNode ( DOMAttr $oldnode )
bool removeAttributeNS ( string $namespaceURI , string $localName )
DOMAttr setAttribute ( string $name , string $value )
DOMAttr setAttributeNode ( DOMAttr $attr )
DOMAttr setAttributeNodeNS ( DOMAttr $attr )
void setAttributeNS ( string $namespaceURI , string $qualifiedName , string $value )
void setIdAttribute ( string $name , bool $isId )
void setIdAttributeNode ( DOMAttr $attr , bool $isId )
void setIdAttributeNS ( string $namespaceURI , string $localName , bool $isId )
/* 继承的方法 */
public DOMNode DOMNode::appendChild ( DOMNode $newnode )
public string DOMNode::C14N ([ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes ]]]] )
public int DOMNode::C14NFile ( string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes ]]]] )
public DOMNode DOMNode::cloneNode ([ bool $deep ] )
public int DOMNode::getLineNo ( void )
public string DOMNode::getNodePath ( void )
public bool DOMNode::hasAttributes ( void )
public bool DOMNode::hasChildNodes ( void )
public DOMNode DOMNode::insertBefore ( DOMNode $newnode [, DOMNode $refnode ] )
public bool DOMNode::isDefaultNamespace ( string $namespaceURI )
public bool DOMNode::isSameNode ( DOMNode $node )
public bool DOMNode::isSupported ( string $feature , string $version )
public string DOMNode::lookupNamespaceURI ( string $prefix )
public string DOMNode::lookupPrefix ( string $namespaceURI )
public void DOMNode::normalize ( void )
public DOMNode DOMNode::removeChild ( DOMNode $oldnode )
public DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode )
}

属性

schemaTypeInfo

Not implemented yet, always return NULL

tagName

The element name

注释

Note:

The DOM extension uses UTF-8 encoding. Use utf8_encode() and utf8_decode() to work with texts in ISO-8859-1 encoding or Iconv for other encodings.

Table of Contents


DOM
在线手册:中文 英文
PHP手册
PHP手册 - N: The DOMElement class

用户评论:

loopduplicate at burningtoken dot com (22-Apr-2011 10:34)

This works perfect for me as well:

<?php $xml = $domElement->ownerDocument->saveXML($domElement); ?>

cannedmeat at spamulike dot com (29-Mar-2011 12:49)

You want to change the tag name of an element in a DOM tree, preserving the structure of its hierarchy of children? Well for applications like translating custom tags to "real" html I've found the following quickest:

<?php
$Document
; // The DOM Document
$Element; // The troublesome element of the document requiring translation

$NewElement = $Document->createElement('newtagname');

// Clone the attributes:
foreach($Element->attributes as $attribute)
$NewElement->setAttribute($attribute->name, $attribute->value);

// Add clones of the old element's children to the replacement
foreach($Element->childNodes as $child)
$NewElement->appendChild($child->cloneNode(true));

// Replace the old node
$Element->parentNode->replaceChild($NewElement, $Element);
?>

Anonymous (24-Dec-2010 04:22)

you can use DOMNode::nodeValue
DOMElement inherits this public property.

$elem->nodeValue

dpetroff ( at ) gmail.com (05-Dec-2010 07:24)

Hi!

Combining all th comments, the easiest way to get inner HTML of the node is to use this function:

<?php
function get_inner_html( $node ) {
   
$innerHTML= '';
   
$children = $node->childNodes;
    foreach (
$children as $child) {
       
$innerHTML .= $child->ownerDocument->saveXML( $child );
    }

    return
$innerHTML;
}
?>

php at fishpig dot co dot uk (11-Jul-2010 05:53)

A quick an easy way to get a string representation of any XML value is as follows:

<?php

 
echo $elem->property->__toString();

?>

adam dot clements at gmail dot com (26-Apr-2010 07:29)

I spent ages figuring out how to get a string representation of a DOMElement (that wasn't the entire DOMDocument), finally I came across this snippet:

<?php $string = $domDocument->saveXML($node); ?>

where $domDocument is the entire document, and $node is the particular node/element/whatever you want a string XML representation of.

nawaman at gmail dot com (04-Sep-2009 04:08)

The following code shows can text-only content be extracted from a document.

<?php
function getTextFromNode($Node, $Text = "") {
    if (
$Node->tagName == null)
        return
$Text.$Node->textContent;

   
$Node = $Node->firstChild;
    if (
$Node != null)
       
$Text = getTextFromNode($Node, $Text);

    while(
$Node->nextSibling != null) {
       
$Text = getTextFromNode($Node->nextSibling, $Text);
       
$Node = $Node->nextSibling;
    }
    return
$Text;
}

function
getTextFromDocument($DOMDoc) {
    return
getTextFromNode($DOMDoc->documentElement);
}

$Doc = new DOMDocument();
$Doc->loadHTMLFile("Test.html");
echo
getTextFromDocument($Doc)."\n";
?>

Daniel Morlock (07-May-2009 05:22)

It would be nice to have a function which converts a document/node/element into a string.

Anyways, I use the following code snippet to get the innerHTML value of a DOMNode:

<?php
function getInnerHTML($Node)
{
    
$Body = $Node->ownerDocument->documentElement->firstChild->firstChild;
    
$Document = new DOMDocument();    
    
$Document->appendChild($Document->importNode($Body,true));
     return
$Document->saveHTML();
}
?>

patrick smith (04-Nov-2008 04:14)

Although it may be preferable to use the dom to manipulate elements, sometimes it's useful to actually get the innerHTML from a document element (e.g. to load into a client-side editor).

To get the innerHTML of a specific element ($elem_id) in a specific html file ($filepath):

<?php
$innerHTML
= '';
$doc = new DOMDocument();
$doc->loadHTMLFile($filepath);   
$elem = $doc->getElementById($elem_id);

// loop through all childNodes, getting html       
$children = $elem->childNodes;
foreach (
$children as $child) {
   
$tmp_doc = new DOMDocument();
   
$tmp_doc->appendChild($tmp_doc->importNode($child,true));       
   
$innerHTML .= $tmp_doc->saveHTML();
}
?>

Pinochet (25-Oct-2008 01:33)

Hi to get the value of DOMElement just get the nodeValue public parameter (it is inherited from DOMNode):
<?php
echo $domElement->nodeValue;
?>
Everything is obvious if you now about this thing ;-)

j DOT wagner ( AT ) medieninnovation.com (08-Oct-2008 05:11)

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.

Severin (14-Sep-2008 02: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 09: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