最近在开发一个需要频繁操作xml文档,尤其是xslt模板的项目时,我遇到了一个让人头疼的问题。php原生的dom扩展虽然功能强大,但其api设计往往显得过于底层和繁琐。例如,创建一个新元素、将其插入到指定位置,或者执行一个xpath查询,都需要好几行代码,而且语法不够直观。
想象一下,当你需要动态地修改XSLT模板,比如在某个
xsl:template
xsl:if
xsl:value-of
DOMDocument
createElementNS
appendChild
insertBefore
这个过程不仅代码量大,而且容易出错,尤其是在处理复杂的嵌套结构时,简直是噩梦。我常常感到,虽然PHP能够处理XML,但这种处理方式远非“优雅”。
幸运的是,我发现了
s9e/sweetdom
s9e/sweetdom
s9e/sweetdom
DOMDocument
DOMElement
安装
s9e/sweetdom
<pre class="brush:php;toolbar:false;">composer require s9e/sweetdom
安装完成后,你就可以在项目中使用它了。
s9e/sweetdom\Document
DOMDocument
evaluate
query
firstOf
DOMXPath
firstOf
null
<pre class="brush:php;toolbar:false;">use s9e\SweetDOM\Document;
$dom = new Document;
$dom->loadXML('<x id="1"><x id="2"/></x>');
// 直接在Document对象上执行XPath查询
var_dump($dom->firstOf('//x')->getAttribute('id'));
// 输出: string(1) "1"
// 甚至可以在Element对象上执行,以该元素作为上下文节点
var_dump($dom->firstOf('//x')->firstOf('x')->getAttribute('id'));
// 输出: string(1) "2"这让XPath查询变得异常简洁和高效。
s9e/sweetdom\Document
$nodeCreator
createXslApplyTemplates
createXslIf
createXslValueOf
<pre class="brush:php;toolbar:false;">use s9e\SweetDOM\Document;
$dom = new Document;
// 创建一个 <xsl:variable name="myVar" select="'hello'"/>
$variable = $dom->nodeCreator->createXslVariable('myVar', "'hello'");
// 创建一个 <xsl:if test="$condition"/>
$ifElement = $dom->nodeCreator->createXslIf('$condition', 'This is true');这是
s9e/sweetdom
s9e/SweetDOM\Element
afterXslText
appendElement
beforeXslText
prependElement
让我们看一个修改XSLT模板的例子:
<pre class="brush:php;toolbar:false;">use s9e\SweetDOM\Document;
$xsl = '<xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<p><span><br/></span></p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/2290">
<img src="https://img.php.cn/upload/ai_manual/001/246/273/175686939683618.png" alt="AiPPT模板广场">
</a>
<div class="aritcle_card_info">
<a href="/ai/2290">AiPPT模板广场</a>
<p>AiPPT模板广场-PPT模板-word文档模板-excel表格模板</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="AiPPT模板广场">
<span>147</span>
</div>
</div>
<a href="/ai/2290" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="AiPPT模板广场">
</a>
</div>
</xsl:template>';
$dom = new Document;
$dom->formatOutput = true; // 格式化输出
$dom->preserveWhiteSpace = false; // 不保留空白节点
$dom->loadXML($xsl);
$span = $dom->firstOf('//span');
// 在<span>元素之后插入一个<xsl:text>
$span->afterXslText('afterXslText');
// 在<span>元素内部末尾插入一个<xsl:text>
$span->appendXslText('appendXslText');
// 在<span>元素之前插入一个<xsl:text>
$span->beforeXslText('beforeXslText');
// 在<span>元素内部开头插入一个<xsl:text>
$span->prependXslText('prependXslText');
// 找到<br/>元素,并用<xsl:text>替换它
$dom->firstOf('//br')->replaceWithXslText('replaceWithXslText');
echo $dom->saveXML($dom->documentElement);输出结果:
<pre class="brush:php;toolbar:false;"><xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<p>
<xsl:text>beforeXslText</xsl:text>
<span>
<xsl:text>prependXslText</xsl:text>
<xsl:text>replaceWithXslText</xsl:text>
<xsl:text>appendXslText</xsl:text>
</span>
<xsl:text>afterXslText</xsl:text>
</p>
</xsl:template>这个例子清晰地展示了
s9e/sweetdom
再看一个插入普通HTML元素的例子:
<pre class="brush:php;toolbar:false;">use s9e\SweetDOM\Document;
$dom = new Document;
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
$dom->loadXML('<p><span><br/></span></p>');
$span = $dom->firstOf('//span');
// 在<span>元素之后插入一个<i>元素
$span->afterElement('i', 'afterElement');
// 在<span>元素内部末尾插入一个<i>元素
$span->appendElement('i', 'appendElement');
// 在<span>元素之前插入一个<i>元素
$span->beforeElement('i', 'beforeElement');
// 在<span>元素内部开头插入一个<i>元素
$span->prependElement('i', 'prependElement');
echo $dom->saveXML($dom->documentElement);输出结果:
<pre class="brush:php;toolbar:false;"><p>
<i>beforeElement</i>
<span>
<i>prependElement</i>
<br/>
<i>appendElement</i>
</span>
<i>afterElement</i>
</p>appendDocumentFragment
<pre class="brush:php;toolbar:false;">use s9e\SweetDOM\Document;
$dom = new Document;
$dom->loadXML('<x/>');
$x = $dom->firstOf('//x');
$x->appendDocumentFragment(
// 回调函数会在片段被添加到DOM之前执行
fn($fragment) => $fragment->appendXML('<y/><z/>')
);
echo $dom->saveXML($x);输出结果:
<pre class="brush:php;toolbar:false;"><x><y/><z/></x>
s9e/sweetdom
s9e/sweetdom
使用
s9e/sweetdom
createElement
appendChild
如果你也曾为PHP原生DOM API的繁琐而苦恼,那么我强烈推荐你尝试
s9e/sweetdom
以上就是告别繁琐的DOM操作:如何使用s9e/sweetdom优雅地处理XML和XSLT模板的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号