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 = null;
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(string $qualifiedName): string
public getAttributeNS(?string $namespace, string $localName): string
public getElementsByTagName(string $qualifiedName): DOMNodeList
public getElementsByTagNameNS(?string $namespace, string $localName): DOMNodeList
public hasAttribute(string $qualifiedName): bool
public hasAttributeNS(?string $namespace, string $localName): bool
public insertAdjacentText(string $where, string $data): void
public prepend(DOMNode|string ...$nodes): void
public remove(): void
public removeAttribute(string $qualifiedName): bool
public removeAttributeNS(?string $namespace, string $localName): void
public replaceChildren(DOMNode|string ...$nodes): void
public replaceWith(DOMNode|string ...$nodes): void
public setAttribute(string $qualifiedName, string $value): DOMAttr|bool
public setAttributeNS(?string $namespace, string $qualifiedName, string $value): void
public setIdAttribute(string $qualifiedName, bool $isId): void
public setIdAttributeNode(DOMAttr $attr, bool $isId): void
public setIdAttributeNS(string $namespace, string $qualifiedName, bool $isId): void
public toggleAttribute(string $qualifiedName, ?bool $force = null): bool
/* 继承方法 */
public DOMNode::C14N(
    bool $exclusive = false,
    bool $withComments = false,
    ?array $xpath = null,
    ?array $nsPrefixes = null
): string|false
public DOMNode::C14NFile(
    string $uri,
    bool $exclusive = false,
    bool $withComments = false,
    ?array $xpath = null,
    ?array $nsPrefixes = null
): int|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
15 年前
注意!
我花了将近一个小时才弄明白,所以我希望它能为至少其中一个你节省一些时间。

如果你想调试你的 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
15 年前
嗨,要获取 DOMElement 的值,只需获取节点值公共参数(它继承自 DOMNode)
<?php
echo $domElement->nodeValue;
?>
如果你知道这件事,一切就很明显了 ;-)
Janne Enberg
10 年前
此页面未列出从 DOMNode 继承的属性,例如非常重要的 textContent 属性。如果它也能列出这些属性,那就太好了。
dpetroff ( at ) gmail.com
13 年前
嗨!

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

<?php
函数 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
函数 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。
函数 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);
}

函数
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
15 年前
虽然使用 dom 操作元素可能更可取,但有时实际上从文档元素获取 innerHTML 很有用(例如,加载到客户端编辑器中)。

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

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

// 遍历所有子节点,获取 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 添加子节点__之前__,请将 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
14 年前
以下代码显示了如何从文档中提取纯文本内容。

<?php
函数 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;
}

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

$Doc = new DOMDocument();
$Doc->loadHTMLFile("Test.html");
echo
getTextFromDocument($Doc)."\n";
?>
Severin
15 年前
我想找到类似的元素 - 这就是我构建 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