2016-10-23 3 views
2

Nach ein wenig Hairpulling entdeckte ich, dass DOMElement-> textContent auch den kombinierten Text von den untergeordneten Elementen dieses Elements zurückgibt.Abrufen des Textinhalts eines bestimmten DOME-Elements

Um ein bisschen herum sah ich Leute vorschlagen DOMElement-> FirstChild-> TextContent, aber das ist nicht gut für mich, weil ich durch das Dokument nach der Hierarchie und Hinweise von Elementattributen durchsehen, die Daten genauso wahrscheinlich sind Ich bin eher auf einem Zweig als auf einem Blatt, also würde ich mehrere Treffer bekommen, obwohl nur einer von ihnen der richtige ist.

Gibt es einen tatsächlichen Weg, um den Textinhalt dieses einen spezifischen Elements und keines seiner Kinder zu erhalten?

EDIT: NVM, einen Weg gefunden, um sicherzustellen, dass

function get_text($el) { 
     if (is_a($el->firstChild, "DOMText")) return $el->firstChild->textContent; 
     return ""; 
    } 
+0

Es sollte ein Weg sein. Können Sie bitte den Code, den Sie verwenden, und die Zeichenfolge anzeigen? – chris85

Antwort

0

einfach die untergeordneten Knoten durchlaufen und überprüfen, ob der nächste Knoten ein Text ist. Sie Vielleicht möchten Sie die Knoten nur Leerzeichen aus, obwohl überspringen:

function getNodeText(DOMNode $node) { 
    if ($node->nodeType === XML_TEXT_NODE) 
    return $node->textContent; 

    $node = $node->firstChild; 
    while ($node) { 
    if ($node->nodeType === XML_TEXT_NODE && 
     $text = trim($node->textContent)) 
    { 
     return $text; 
    } 
    $node = $node->nextSibling; 
    } 
    return ''; 
} 

$xml = <<<'EOXML' 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <child> 
    <x>x text</x> 
    child text 
    </child> 
    root text 
</root> 
EOXML; 


$doc = new DOMDocument(); 
$doc->loadXML($xml); 

var_dump(getNodeText($doc->getElementsByTagName('x')[0])); 
var_dump(getNodeText($doc->getElementsByTagName('root')[0])); 
var_dump(getNodeText($doc->getElementsByTagName('child')[0])); 

Beispielausgabe

string(6) "x text" 
string(9) "root text" 
string(10) "child text" 
Verwandte Themen