PHP Conference Japan 2024

DOMElement 类

(PHP 5、PHP 7、PHP 8)

类概要

class DOMElement extends DOMNode implements DOMParentNode, DOMChildNode {
/* 继承的常量 */
/* 属性 */
public readonly string $tagName;
public string $id;
public readonly mixed $schemaTypeInfo;
public readonly ?DOMElement $firstElementChild;
public readonly ?DOMElement $lastElementChild;
public readonly int $childElementCount;
/* 继承的属性 */
public readonly string $nodeName;
public readonly int $nodeType;
public readonly ?DOMNode $parentNode;
public readonly ?DOMElement $parentElement;
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 bool $isConnected;
public readonly ?DOMDocument $ownerDocument;
public readonly ?string $namespaceURI;
public string $prefix;
public readonly ?string $localName;
public readonly ?string $baseURI;
/* 方法 */
public __construct(string $qualifiedName, ?string $value = null, string $namespace = "")
public after(DOMNode|string ...$nodes): void
public append(DOMNode|string ...$nodes): void
public before(DOMNode|string ...$nodes): void
public getAttribute(字符串 $qualifiedName): 字符串
public getAttributeNS(?字符串 $namespace, 字符串 $localName): 字符串
public getElementsByTagNameNS(?字符串 $namespace, 字符串 $localName): DOMNodeList
public hasAttribute(字符串 $qualifiedName): 布尔值
public hasAttributeNS(?字符串 $namespace, 字符串 $localName): 布尔值
public prepend(DOMNode|字符串 ...$nodes): void
public remove(): void
public removeAttribute(字符串 $qualifiedName): 布尔值
public removeAttributeNS(?字符串 $namespace, 字符串 $localName): void
public replaceWith(DOMNode|字符串 ...$nodes): void
public setAttribute(字符串 $qualifiedName, 字符串 $value): DOMAttr|布尔值
public setAttributeNS(?字符串 $namespace, 字符串 $qualifiedName, 字符串 $value): void
public setIdAttribute(字符串 $qualifiedName, 布尔值 $isId): void
public setIdAttributeNS(字符串 $namespace, 字符串 $qualifiedName, 布尔值 $isId): void
public toggleAttribute(字符串 $qualifiedName, ?布尔值 $force = null): 布尔值
/* 继承的方法 */
public DOMNode::C14N(
    布尔值 $exclusive = false,
    布尔值 $withComments = false,
    ?数组 $xpath = null,
    ?数组 $nsPrefixes = null
): 字符串|false
public DOMNode::C14NFile(
    字符串 $uri,
    布尔值 $exclusive = false,
    布尔值 $withComments = false,
    ?数组 $xpath = null,
    ?数组 $nsPrefixes = null
): 整数|false
public DOMNode::isEqualNode(?DOMNode $otherNode): bool
public DOMNode::isSameNode(DOMNode $otherNode): bool
public DOMNode::isSupported(string $feature, string $version): bool
}

属性

childElementCount

子元素的数量。

firstElementChild

第一个子元素或null

lastElementChild

最后一个子元素或null

nextElementSibling

下一个兄弟元素或null

previousElementSibling

上一个兄弟元素或null

schemaTypeInfo

尚未实现,始终返回null

tagName

元素名称

className

表示元素类名的字符串,用空格分隔

id

元素 ID

变更日志

版本 描述
8.0.0 添加了firstElementChildlastElementChildchildElementCountpreviousElementSiblingnextElementSibling属性。
8.0.0 DOMElement 现在实现了 DOMParentNodeDOMChildNode

备注

注意:

DOM 扩展使用 UTF-8 编码。使用 mb_convert_encoding()UConverter::transcode()iconv() 处理其他编码。

目录

添加备注

用户贡献的注释 13 条注释

j DOT wagner ( AT ) medieninnovation.com
16 年前
警告!


我花了将近一个小时才弄清楚这个问题,所以我希望它能为你们中的至少一个人节省一些时间。

如果你想调试你的DOM树并尝试使用var_dump()或类似函数,你会被误导认为你正在查看的DOMElement是空的,因为var_dump()会显示:object(DOMElement)#1 (0) { }

经过大量的调试,我发现所有DOM对象都对var_dump()和print_r()不可见,我猜是因为它们是C对象而不是PHP对象。所以,我尝试了saveXML(),它在DOMDocument上运行良好,但在DOMElement上没有实现。

解决方案很简单(如果你知道的话)
$xml = $domElement->ownerDocument->saveXML($domElement);

这将为你提供$domElement的XML表示形式。
Pinochet
16 年前
嗨,要获取DOMElement的值,只需获取nodeValue公共参数(它继承自DOMNode)
<?php
echo $domElement->nodeValue;
?>
如果你知道这个东西,一切都很明显 ;-)
Janne Enberg
11年前
此页面未列出从DOMNode继承的属性,例如非常重要的textContent属性。如果它也能列出这些属性,将非常有帮助。
dpetroff ( at ) gmail.com
14年前
嗨!

结合所有评论,获取节点内部HTML的最简单方法是使用此函数

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

return
$innerHTML;
}
?>
Daniel Morlock
15年前
最好有一个函数可以将文档/节点/元素转换为字符串。

无论如何,我使用以下代码片段获取DOMNode的innerHTML值

<?php
function getInnerHTML($Node)
{
$Body = $Node->ownerDocument->documentElement->firstChild->firstChild;
$Document = new DOMDocument();
$Document->appendChild($Document->importNode($Body,true));
return
$Document->saveHTML();
}
?>
felix dot klee at inka dot de
11年前
如何重命名元素并保留属性

<?php

// 将元素$element的名称更改为$newName。
function renameElement($element, $newName) {
$newElement = $element->ownerDocument->createElement($newName);
$parentElement = $element->parentNode;
$parentElement->insertBefore($newElement, $element);

$childNodes = $element->childNodes;
while (
$childNodes->length > 0) {
$newElement->appendChild($childNodes->item(0));
}

$attributes = $element->attributes;
while (
$attributes->length > 0) {
$attribute = $attributes->item(0);
if (!
is_null($attribute->namespaceURI)) {
$newElement->setAttributeNS('http://www.w3.org/2000/xmlns/',
'xmlns:'.$attribute->prefix,
$attribute->namespaceURI);
}
$newElement->setAttributeNode($attribute);
}

$parentElement->removeChild($element);
}

function
prettyPrint($d) {
$d->formatOutput = true;
echo
'<pre>'.htmlspecialchars($d->saveXML()).'</pre>';
}

$d = new DOMDocument( '1.0' );
$d->loadXML('<?xml version="1.0"?>
<library>
<data a:foo="1" x="bar" xmlns:a="http://example.com/a">
<invite>
<username>jmansa</username>
<userid>1</userid>
</invite>
<update>1</update>
</data>
</library>'
);

$xpath = new DOMXPath($d);
$elements = $xpath->query('/library/data');
if (
$elements->length == 1) {
$element = $elements->item(0);
renameElement($element, 'invites');
}

prettyPrint($d);

?>
patrick smith
16 年前
虽然可能更倾向于使用dom来操作元素,但有时实际上从文档元素获取innerHTML也很有用(例如,加载到客户端编辑器中)。

要获取特定HTML文件($filepath)中特定元素($elem_id)的innerHTML

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

// 循环遍历所有childNodes,获取html
$children = $elem->childNodes;
foreach (
$children as $child) {
$tmp_doc = new DOMDocument();
$tmp_doc->appendChild($tmp_doc->importNode($child,true));
$innerHTML .= $tmp_doc->saveHTML();
}
?>
ae.fxx
16 年前
你好。

请记住,在尝试向DOMNode添加子节点**之前**,先将其(或其任何后代)附加到DOMDocument。

我不知道为什么必须这样,但如果不这样做就无法完成。

再见
johnny
10年前
获取节点的html
$html .= $dom->saveHTML($node);
Anonymous
13年前
你可以使用DOMNode::nodeValue
DOMElement继承了此公共属性。

$elem->nodeValue
loopduplicate at burningtoken dot com
13年前
这对我也非常有效



<?php $xml = $domElement->ownerDocument->saveXML($domElement); ?>
nawaman at gmail dot com
15年前
以下代码演示了如何从文档中提取纯文本内容。

<?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";
?>
Severin
16 年前
我想找到类似的元素 - 所以我构建了一个这样的 XPath 字符串 - 也许有人需要它... 它不太漂亮 - 但 domdocument 也不是 :)

<?php

$dom
->load($xmlFile))

$xpathQuery = '//*';
$xmlNodes = $xpath->query($xpathQuery);

$pathlist = array();
$attrlist = array();
foreach (
$xmlNodes as $node) {

$depth = $this->_getDomDepth($node); // 获取路径深度 (用于数组键)
$pathlist[$depth] = $node->tagName; // 标签名

$attrs = $node->attributes;
$attr='';
$a=0;
foreach (
$attrs as $attrName => $attrNode) // 属性
{
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]; // 当前元素的 XPath

// ... 现在您可以继续使用 $path 查找类似的元素
}
}
}

private function
_getDomDepth(DomNode $node)
{
$r = -2;
while (
$node) {
$r++;
$node = $node->parentNode;
}
return
$r;
}
?>
To Top