cse / dom-manager
一个用于管理DOM(XML,HTML)文档的简单库。
Requires
- php: >=7.2
- ext-dom: *
- ext-libxml: *
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-16 00:49:48 UTC
README
英语 | 俄语
DOM Manager
一个用于管理DOM(XML,HTML)文档的简单库。
项目仓库: https://github.com/cs-eliseev/dom-manager
DEMO
use cse\DOMManager\DomManager; ... $content = file_get_contents('https://w3schools.org.cn/xml/simple.xml'); $easyLoader = new DomManager(); $node = $easyLoader->parse($content); $name = $node->find('name')->first()->text(); // Belgian Waffles
安装
您可以在这里找到此项目的最新版本。
Composer
执行以下命令以获取该包的最新版本
composer require cse/dom-manager
或者composer.json文件应包含以下内容
{ "require": { "cse/dom-manager": "*" } }
Git
在本地上克隆此仓库
git clone https://github.com/cs-eliseev/dom-manager.git
下载
用法
以下演示如何在PHP应用程序中使用此库的函数。
初始化
DomManager实例将数据转换为操作DOM树的结构。
转换XML结构
use cse\DOMManager\IDomManager; ... $easyLoader = new IDomManager(); $nodes = $easyLoader->parse('<div><br/><br/></div>'); // Nodes entity
通过DOMDocument转换HTML结构
use cse\DOMManager\DomManager; ... $domDocument = new DOMDocument('1.0', 'UTF-8'); $domDocument->loadHTML('<div><br><br></div>'); $easyLoader = new DomManager(); $nodes = $easyLoader->parse($domDocument); // Nodes entity
转换DOMNodeList
use cse\DOMManager\DomManager; ... $domDocument = new DOMDocument('1.0', 'UTF-8'); $domDocument->loadXML('<div><br/><br/></div>'); $easyLoader = new DomManager(); $nodes = $easyLoader->parse($domDocument->getElementsByTagName('br')); // Nodes entity
转换DOMNode
use cse\DOMManager\DomManager; ... $domDocument = new DOMDocument('1.0', 'UTF-8'); $domDocument->loadXML('<div><br/><br/></div>'); $easyLoader = new DomManager(); $nodes = $easyLoader->parse($domDocument->getElementsByTagName('br')->item(1)); // Nodes entity
Nodes实例表示一个DOMNode对象的列表,可以进行操作。
方法
示例
文档内容示例
<main class="main" role="main"> <div class="content"> <div> <h1><i class="icon"/><span>Header</span>-subheader</h1> <img src="content_img.jpg" alt="content img"/> <p><span class="text">First text</span></p> </div> <br/> <p>Last text</p> </div> <div class="description" role="contentinfo"> <p>First description</p> <br/> <em>Middle description</em> <p><span>Last description</span></p> </div> </main>
查找元素
返回所有找到的节点元素。
按标签名称搜索
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div');
结果
<div class="content"><div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div><br/><p>Last text</p></div> <div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div> <div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div>
按XPath查找
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('//div/div');
结果
<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div>
按属性查找
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('//*[@class="content"]');
结果
<div class="content"><div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div><br/><p>Last text</p></div>
第一个元素
返回第一个找到的节点元素。
列表中的第一个项目
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->first();
结果
<p><span class="text">First text</span></p>
节点中的第一个找到的元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->first('p');
结果
<p><span class="text">First text</span></p>
通过XPath在节点中找到的第一个元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->first('//span[@class]');
结果
<span class="text">First text</span>
节点中的第一个找到的元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div')->first('p');
结果
<p><span class="text">First text</span></p> <p><span class="text">First text</span></p> <p>First description</p>
最后的元素
返回最后一个找到的节点元素。
列表中的最后一个项目
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->last();
结果
<p><span>Last description</span></p>
节点中的最后一个找到的元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->last('p');
结果
<p><span>Last description</span></p>
通过XPath在节点中找到的最后一个元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->last('//span[@class]');
结果
<span class="text">First text</span>
节点中的最后一个找到的元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div')->last('p');
结果
<p>Last text</p> <p><span class="text">First text</span></p> <p><span>Last description</span></p>
第N个元素
按索引返回元素。
第N个列表项
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->getByPosition(1);
结果
<p>Last text</p>
节点中的第N个找到的元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->getByPosition(1, 'p');
结果
<p>Last text</p>
通过XPath在节点中找到的第N个元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->getByPosition(2, '//*[@class]');
结果
<i class="icon"/>
节点中的第N个找到的元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div')->getByPosition(1, 'p');
结果
<p>Last text</p> <p><span>Last description</span></p>
最接近的元素
返回最近的父元素。
按标签名称查找最接近的父元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('span')->closest('div');
结果
<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div> <div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div> <div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div>
父元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('span')->closest();
结果
<h1><i class="icon"/><span>Header</span>-subheader</h1> <p><span class="text">First text</span></p> <p><span>Last description</span></p>
父元素
返回父元素。
父元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('span')->parent();
结果
<h1><i class="icon"/><span>Header</span>-subheader</h1> <p><span class="text">First text</span></p> <p><span>Last description</span></p>
根元素
返回根元素。
主要父元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('span')->root();
结果
<main class="main" role="main"><div class="content"><div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div><br/><p>Last text</p></div><div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div></main>
子元素
返回节点的所有子元素。
在节点中获取子元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->childes();
结果
<span class="text">First text</span> <span>Last description</span>
在节点中查找子元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->childes('p');
结果
<span class="text">First text</span> <span>Last description</span>
按XPath查找
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->childes('//*[@class="description"]/p');
结果
<span>Last description</span>
第一个子元素
返回节点的第一个子元素。
在节点中获取第一个子元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div')->firstChild();
结果
<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div> <h1><i class="icon"/><span>Header</span>-subheader</h1> <p>First description</p>
在节点中查找子元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->firstChild();
结果
<span class="text">First text</span> <span>Last description</span>
在节点中查找子元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->firstChild('div');
结果
<span class="text">First text</span> <span>Last description</span>
在节点中查找子元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->firstChild('p');
结果
<div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></div> <h1><i class="icon"/><span>Header</span>-subheader</h1> <p>First description</p>
按XPath查找
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->firstChild('//div/div');
结果
<h1><i class="icon"/><span>Header</span>-subheader</h1>
获取DOMNode
按索引返回DOMNode元素。
按索引获取元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->getNodeByPosition(1);
结果
class DOMElement {}
查找DOMNode
按索引返回找到的DOMNode元素。
查找元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->findNodeByPosition(1, 'p');
结果
class DOMElement {}
节点名
返回节点名。
节点名
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div')->name();
结果
div
div
div
重命名节点
重命名节点。
重命名当前节点
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div')->rename('section');
结果
<section class="content"><section><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></section><br/><p>Last text</p></section> <section><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p></section> <section class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></section>
查找并重命名节点
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->rename('section', 'div');
<div class="content"><div><h1><i class="icon"/><strong>Header</strong>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><strong class="text">First text</strong></p></div><br/><p>Last text</p></div> <div><h1><i class="icon"/><strong>Header</strong>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><strong class="text">First text</strong></p></div> <div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><strong>Last description</strong></p></div>
替换节点
替换节点。
替换当前节点。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div')->replace('<section><div>Header</div>Content</section>');
<main class="main" role="main"><section><div>Header</div>Content</section><section><div>Header</div>Content</section></main>
查找并替换节点。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->replace('<section><div>Header</div>Content</section>', 'div');
结果
<main class="main" role="main"><section><div>Header</div>Content</section><section><div>Header</div>Content</section></main>
通过XPath查找并替换节点。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->replace('<section><div>Header</div>Content</section>', '//div/div');
结果
<main class="main" role="main"><div class="content"><section><div>Header</div>Content</section><br/><p>Last text</p></div><div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div></main>
删除节点
删除节点。
删除当前节点。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('div')->remove();
结果
<main class="main" role="main"/>
查找并删除节点。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->remove('div');
结果
<main class="main" role="main"/>
通过XPath查找并删除节点。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->remove('//div/div');
结果
<main class="main" role="main"><div class="content"><br/><p>Last text</p></div><div class="description" role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p></div></main>
计数
计算元素数量。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->count(); // 4 $nodes->count('p'); // 4 $nodes->count('//*[@class]'); // 5
元素存在
检查节点是否存在。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->exist(); // true $nodes->exist('p'); // true $nodes->exist('//*[@class]'); // true $nodes->exist('hr'); // false
元素不存在
检查节点不存在。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->notExist(); // false $nodes->notExist('p'); // false $nodes->notExist('//*[@class]'); // false $nodes->notExist('hr'); // true
是否为元素
检查元素数量是否为1。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('img')->isElem(); // true $nodes->find('p')->isElem(); // false
是否为列表
检查元素数量是否超过1。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('img')->isList(); // false $nodes->find('p')->isList(); // true
DomComment
验证DOMComment。使用isElem。默认情况下忽略节点DOMComment。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('img')->isDomComment(); // false $nodes->find('p')->isDomComment(); // false
DomElement
验证DomElement。使用isElem。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('img')->isDomElement(); // true $nodes->find('p')->isDomElement(); // false $nodes->find('p')->first()->isDomElement(); // true
DomText
验证DomText。使用isElem。默认情况下忽略节点DomText。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('img')->isDomText(); // false $nodes->find('p')->isDomText(); // false
节点类型
节点类型。默认情况下忽略节点类型非1。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('img')->type(); // 1 $nodes->find('p')->type(); // 1\n1\n1\n1
文本
返回文本。
获取当前项的文本
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('//h1/span')->text(); // Header $nodes->find('h1')->text(); // Header-subheader $nodes->find('//*[@class="content"]')->text(); // Header-subheaderFirst textLast text
获取列表的文本
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->text();
结果
First text
Last text
First description
Last description
添加文本
将文本添加到节点的末尾。
添加文本到空元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('//h1/i')->addText('add text');
结果
<i class="icon">add text</i>
添加文本到元素的末尾
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->addText('add text');
结果
<h1><i class="icon"/><span>Header</span>-subheaderadd text</h1>
添加文本到列表
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->addText('add text');
结果
<p><span class="text">First text</span>add text</p> <p>Last textadd text</p> <p>First descriptionadd text</p> <p><span>Last description</span>add text</p>
替换文本
在节点中替换文本。
添加文本到空元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('//h1/i')->replaceText('change text');
结果
<i class="icon">add text</i>
在节点中替换文本
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->replaceText('change text');
结果
<h1><i class="icon"/><span>Header</span>change text</h1>
替换列表中的文本
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->replaceText('change text');
结果
<p><span class="text">First text</span>change text</p> <p>change text</p> <p>change text</p> <p><span>Last description</span>change text</p>
删除文本
在节点中删除文本。
在节点中删除文本
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->removeText();
结果
<h1><i class="icon"/><span>Header</span></h1>
删除列表中的文本
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->replaceText('change text');
结果
<p><span class="text">First text</span></p> <p></p> <p></p> <p><span>Last description</span></p>
属性
返回属性值。
获取列表值
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->attr('class');
结果
content
description
获取值
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->attr('role');
结果
contentinfo
默认值
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->attr('role', 'default');
结果
default
default
contentinfo
是否有属性
检查属性是否存在。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('img')->hasAttr('src'); // true $nodes->find('i')->hasAttr('class'); // true $nodes->find('p')->hasAttr('class'); // false $nodes->find('div')->hasAttr('class'); // false
设置属性
设置属性值。
设置元素的属性
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $elem = $nodes->find('i'); $elem->setAttr('class', 'value'); // <i class="value"/> $elem->setAttr('data-value', 'edit'); // <i class="value" data-value="edit"/> $elem->setAttr('class', 'icon value'); // <i class="icon value" data-value="edit"/>
设置列表的属性
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $elem = $nodes->find('p')->setAttr('class', 'text');
结果
<p class="text"><span class="text">First text</span></p> <p class="text">Last text</p> <p class="text">First description</p> <p class="text"><span>Last description</span></p>
删除属性
删除属性。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $elem = $nodes->find('span')->removeAttr('class');
结果
<span>Header</span> <span>First text</span> <span>Last description</span>
添加子节点
添加子节点。
添加到空元素
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('i')->appendChild('<section><div>Header</div>Content</section>');
结果
<i class="icon"><section><div>Header</div>Content</section></i>
添加到列表
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->appendChild('<section><div>Header</div>Content</section>');
结果
<p><span class="text">First text</span><section><div>Header</div>Content</section></p> <p>Last text<section><div>Header</div>Content</section></p> <p>First description<section><div>Header</div>Content</section></p> <p><span>Last description</span><section><div>Header</div>Content</section></p>
查找并添加
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->appendChild('<section><div>Header</div>Content</section>', 'p');
结果
<p><span class="text">First text</span><section><div>Header</div>Content</section></p> <p>Last text<section><div>Header</div>Content</section></p> <p>First description<section><div>Header</div>Content</section></p> <p><span>Last description</span><section><div>Header</div>Content</section></p>
替换子节点
替换子节点。
替换所有子节点
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->replaceChildes('<section><div>Header</div>Content</section>');
结果
<h1><section><div>Header</div>Content</section><section><div>Header</div>Content</section>-subheader</h1>
通过节点名替换子节点
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->replaceChildes('<section><div>Header</div>Content</section>', 'i');
结果
<h1><section><div>Header</div>Content</section><span>Header</span>-subheader</h1>
删除子节点
删除子节点。
删除所有子节点
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->removeChildes();
结果
<h1>-subheader</h1>
通过节点名删除后代
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->removeChildes('i');
结果
<h1><span>Header</span>-subheader</h1>
DOMNode列表
返回DOMNode元素列表。
列表
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->toArray();
结果
[ class DOMElement {}, class DOMElement {}, class DOMElement {}, class DOMElement {} ]
NodeList
返回NodeList。
NodeList
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('p')->toList();
结果
class NodeList {}
内容
返回元素及其内容的标记。
获取当前元素的内容
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->find('h1')->toString();
结果
<h1><i class="icon"/><span>Header</span>-subheader</h1>
查找并获取元素的内容
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->toString('h1');
结果
<h1><i class="icon"/><span>Header</span>-subheader</h1>
通过XPath查找并获取元素的内容
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $nodes->toString('//div/p');
结果
<p><span class="text">First text</span></p> <p>Last text</p> <p>First description</p> <p><span>Last description</span></p>a
遍历元素
对每个项目调用回调函数。
/** @var \cse\DOMManager\Nodes\Nodes $nodes */ $elem = $nodes->find('div'); $elem->each(function (\cse\DOMManager\Nodes\Nodes $item) { if ($item->hasAttr('class')) { $item->removeAttr('class'); } $item->addText('this div element'); }); echo $elem->root()->content();
结果
<main class="main" role="main"><div><div><h1><i class="icon"/><span>Header</span>-subheader</h1><img src="content_img.jpg" alt="content img"/><p><span class="text">First text</span></p>this div element</div><br/><p>Last text</p>this div element</div><div role="contentinfo"><p>First description</p><br/><em>Middle description</em><p><span>Last description</span></p>this div element</div></main>
测试 & 代码覆盖率
PHPUnit用于单元测试。单元测试确保类和方法确实做了它应该做的事情。
PHPUnit的通用文档可以在以下地址找到:https://phpunit.de/documentation.html。
要运行PHPUnit单元测试,执行以下命令:
phpunit PATH/TO/PROJECT/tests/
如果您需要代码覆盖率报告,请使用以下命令:
phpunit --coverage-html ./report PATH/TO/PROJECT/tests/
使用PHPUnit默认配置
phpunit --configuration PATH/TO/PROJECT/phpunit.xml
支持项目
非常感谢那些愿意帮助项目开发的人们。您可以通过以下方式帮助:
- 添加错误报告或改进建议。
- 通过发送Pull Request分享代码改进。
- 为您所在的国家进行翻译或优化。
- 修改文档。
- 以及其他任何帮助。
许可证
此PHP库是在MIT许可证下开源的。有关更多信息,请参阅许可证文件。
GitHub @cs-eliseev