2016-04-29 5 views
0

Wie man den Knoten filtert, der eine bestimmte Zeichenkette darin hat und Delete oder Remove es.Php - wie zu entfernen/löschen tag mit bestimmten string in QueryPath?

So etwas wie

Die XML ist wie:

<?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> 

Sagen wir, ich entfernen möchten/löschen <link> www.weblink-4.com</link> mit QueryPath wie erreichen Sie das?

habe ich versucht, so etwas wie:

$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* 

ich auch so etwas wie versucht:

$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* 

Und dann so etwas wie:

$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"?>* 

Dies sollte einfach sein, aber drehen, um eher sehr stressig zu sein ..... Irgendwelche Vorschläge?

Antwort

0

Um dies zu erreichen, wurde QueryPath ziemlich stressig. Ich habe einen Hinweis aus: @ Paul Crovella ... Und eher ich verwenden:

$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); 

Das war schnell und effektiv.

Ich hoffe, es hilft jemandem.

0

filterPreg funktioniert in Ordnung für mich.

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

Obwohl .. Ich denke, es wird Looping erfordern, obwohl die $ gefilterten Elemente der HTML zu rekonstruieren, die IMO nicht ideal ist ..

+0

Dank obwohl ich Warnung angezeigt: 'Achtung: preg_match(): Trennzeichen darf nicht alphanumerisch oder Backslash sein in ... ' –

+0

Ich benutze ältere (2.1) Version von QP, so dass das der Grund für den Unterschied sein könnte ... Verschiedene Begrenzer für filterPreg, wie" # www.weblinky - [^ 4] .com # "könnte auch ausprobiert werden. –

+0

Bin jetzt mit einem anderen Problem konfrontiert ... Kann Ihnen helfen ... Siehe Link ::: http://StackOverflow.com/Questions/36957442/PHP-XPath-apppendchild-not-Working-properly –