相关疑难解决方法(0)

2071
推荐指数
28
解决办法
40万
查看次数

10
推荐指数
1
解决办法
4431
查看次数

遍历DOM树

由于大多数(所有?)进行HTML清理的PHP库(如HTML Purifier)严重依赖于正则表达式,我认为尝试编写使用DOMDocument和相关类的HTML清理程序将是一个值得的实验.虽然我现在处于非常早期的阶段,但到目前为止,该项目显示了一些希望.

我的想法围绕一个类,该类使用DOMDocument遍历提供的标记中的所有节点,将它们与白名单进行比较,并删除不在白名单上的任何内容.(第一个实现是非常基本的,只根据类型删除节点,但我希望能够更加复杂并分析节点的属性,链接是否会在将来对不同域中的项进行寻址等).

我的问题是如何遍历DOM树?据我所知,DOM*对象有一个childNodes属性,所以我需要在整个树上进行递归吗?此外,DOMNodeLists的早期实验表明,您需要非常小心删除的顺序,否则您可能会留下项目或触发异常.

如果有人有使用PHP操作DOM树的经验,我会很感激您对该主题的任何反馈.

编辑:我为我的HTML清理类构建了以下方法.它以递归方式遍历DOM树并检查找到的元素是否在白名单中.如果不是,则将其删除.

我遇到的问题是,如果删除节点,DOMNodeList中所有后续节点的索引都会发生变化.简单地从下到上工作可以避免这个问题.目前它仍然是一种非常基本的方法,但我认为它显示出了希望.它肯定比HTMLPurifier快得多,尽管Purifier做了很多东西.

/**
 * Recursivly remove elements from the DOM that aren't whitelisted
 * @param DOMNode $elem
 * @return array List of elements removed from the DOM
 * @throws Exception If removal of a node failed than an exception is thrown
 */
private function cleanNodes (DOMNode $elem)
{
    $removed    = array ();
    if (in_array ($elem -> nodeName, $this -> whiteList))
    {
        if ($elem -> hasChildNodes ())
        {
            /*
             * Iterate over the element's children. …
Run Code Online (Sandbox Code Playgroud)

php dom traversal

9
推荐指数
1
解决办法
7141
查看次数

简化PHP DOM XML解析 - 如何?

我花了一整天的PHP的DOM函数但我无法理解它是如何工作的.:(我有一个简单的XML文件,看起来没问题,但我不能使用它我的想法,当我创建它的结构.

示例XML片段:

-pages //root element
    -page id="1" //we can have any number of pages
        -product id="364826" //we can have any number of products
            -SOME_KIND_OF_VALUE
            -ANOTHER_VALUE
            ...
Run Code Online (Sandbox Code Playgroud)

我最初的想法是加快我的客户工作流程,所以我扔掉旧的CSV并开始使用XML.

问题1: 当我将产品分组到页面时,我使用setIdAttribute来防止在树中多次存储同一页面.这样可以正常读取,因为这些id与某种DTD(基于getElementById)相关联.

问题1: 我如何编写一个提供这些必要信息的简单DTD,以便我也可以getElementById在阅读阶段使用?

问题2: 因为我有页面我想加载尽可能少的信息.这就是我在页面上创建id属性的原因.现在我无法直接访问我的页面id ="2"因为上面的问题1(getElementById目前没有意义).不知何故,我可以设法检索给定页面上每个产品的必要信息,但我的代码看起来很吓人:

$doc      = DOMDocument::load('data.xml');
$xpath    = new DOMXPath($doc);
$query    = '/pages/page[' . $page . ']'; //$page is fine: was set earlier
$products = $xpath->query($query);
$_prods   = $doc->getElementsByTagName('product');
foreach($_prods as $product){
    foreach($product->childNodes as $node){
        echo $node->nodeName . ": " . …
Run Code Online (Sandbox Code Playgroud)

php xml parsing dom

7
推荐指数
1
解决办法
7353
查看次数

标签 统计

php ×4

dom ×3

parsing ×2

xml ×2

domdocument ×1

html ×1

html-parsing ×1

html5 ×1

traversal ×1

xml-parsing ×1