0

如何过滤其中包含特定字符串的节点和Delete/或Remove它。

就像是

XML就像:

<?xml version="1.0"?>
    <user>

        <urls>
          <link>www.weblink-1.com</link>
          <link> www.weblink-2.com</link>
          <link> www.weblink-3.com</link>
          <link> www.weblink-4.com</link>
          <link> www.weblink-5.com</link>
        </urls>

    </user>

假设我想<link> www.weblink-4.com</link>使用QueryPath您如何实现删除/删除?

我试过类似的东西:

 $r= qp($path,'user')->find("urls>link")->
 filter("link:contains('<link> www.weblink-4.com</link>')");
 print  "<h1>".$r."</h1>";

 ///***ERROR: Catchable fatal error: 
 Object of class QueryPath\DOMQuery could not be converted to string* 

我也尝试过类似的东西:

 $r= qp($path,'user')->find("urls>link:contains('<link> www.weblink-4.com</link>')"); 

 print  "<h1>".$r."</h1>";


 ///***ERROR: Catchable fatal error: 
 Object of class QueryPath\DOMQuery could not be converted to string* 

然后是这样的:

 $qp =  qp($path,'user>urls>link')->filter("link:contains('<link> www.weblink-4.com</link>')")->remove();
$qp->writeXML($path);   

   ///This Deletes the entire Document's nodes leaving only the *<?xml version="1.0"?>* 

这应该很简单,但变得非常有压力......有什么建议吗?

4

2 回答 2

0

filterPreg 对我来说没问题。

$elements = htmlqp($page, 'user urls linky');
$filtered = $elements->filterPreg("/www.weblinky-[^4].com/");
echo count($filtered ); // 4

虽然..我认为它需要循环通过 $filtered 元素来重建 HTML,这不是理想的 IMO..

于 2016-04-30T11:38:27.793 回答
0

为了实现这一点,QueryPath 变得有点压力。我得到了一些提示:@Paul Crovella ... 而我使用的是:

$path = "../ntmhp/prdat/".$userId."/xmls/rf/rss.xml";
            $dom = new DOMDocument();
            $dom->load($path);

            $xpath = new DOMXPath($dom);

            foreach($xpath->query('//link[contains(., "www.weblink-4.com")]') as $node) {
            $node->parentNode->removeChild($node);
            }

            $dom->save($path);

这是快速有效的。

希望它可以帮助某人。

于 2016-04-29T21:06:07.663 回答