2014-02-18 3 views
6

Ich habe variable Dokumente, die ich im laufenden Betrieb ändern muss. Zum Beispiel könnte ich ein Dokument haben, wie folgt:Wie erhält man ein bestimmtes Tag in einem DOMDocument in PHP?

<!--?xml version="1.0"?--> 
<item> 
    <tag1></tag1> 
</item> 
<tag2> 
    <item></item> 
    <item></item> 
</tag2> 

Dies wird sehr vereinfacht, aber ich habe Tags mit dem gleichen Namen auf verschiedenen Ebenen. Ich möchte die Artikel-Tags innerhalb von 'tag2' erhalten. Die tatsächlichen Tags in den Dateien, die ich erhalte, haben eindeutige IDs, um sie sowie einige andere Attribute zu unterscheiden. Ich muss das Tag finden, auskommentieren und das XML speichern. Ich konnte DOMDocument dazu bringen, den Tag2-Knoten zurückzugeben, aber ich bin mir nicht sicher, wie ich auf die Item-Tags innerhalb dieser Struktur zugreifen soll.

Antwort

4

Dies ist die Art von Problem, das DOMDocument Klasse PHP zeichnet sich. Zuerst laden Sie die XML-Zeichenfolge mit loadHTML() Methode, und dann einen XPath-Ausdruck verwenden, um den DOM-Baum zu durchlaufen:

$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 

$item_tags = $xpath->query('//tag2/item'); 
foreach ($item_tags as $tag) { 
    echo $tag->tagName, PHP_EOL; // example 
} 

Online demo

+0

Yup - Ich würde normalerweise mit XPath über 'getElementsByTagName()' für so etwas gehen. – CD001

+0

Aber ich schlage vor, evaluate(), nicht query(). Es ermöglicht auch XPath-Ausdrücke, die Skalare zurückgeben. – ThW

1
<?php 
$tag= new DOMDocument(); 
$tag->loadHTML($string); 

foreach ($tag->getElementsByTagName("tag") as $element) 
{ 
    echo $tag->saveXML($element); 
} 
?> 

sein kann, hilft Ihnen .try es

+0

Das Problem mit 'getElementsByTagName()' auf diese Weise ist, dass es doesn Es ist wirklich egal, wo diese Tags erscheinen - also würde 'getElementsByTagName ('item')' eigentlich alle '/ item' und'/tag2/item' entsprechen, was nicht genau das ist, was das OP nach AIUI war. – CD001

0
$DOMNode -> attributes -> getNamedItem('yourAttribute') -> value; 
Verwandte Themen