2016-10-23 2 views
2

После небольшого стрижки я обнаружил, что DOMElement-> textContent также возвращает комбинированный текст из дочерних элементов этого элемента.Получение текстового содержимого определенного DOMElement

Оглядываясь немного, я видел людей, предлагающих DOMElement-> firstChild-> textContent, но это не хорошо для меня, потому что я просматриваю документ, следуя иерархии и подсказки атрибутов элемента, данные так же вероятны, быть на ветке, а не на листе, поэтому я бы получил несколько ударов, хотя только один из них правильный.

Есть ли реальный способ получить текстовое содержимое этого конкретного элемента и ни одного из его детей?

EDIT: NVM, нашел способ, чтобы убедиться,

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

Там должен быть путь. Можете ли вы показать код, который вы используете, и строку? – chris85

ответ

0

Просто перебирать дочерние узлы и проверить, если следующий узел является текстовым. Вы можете пропустить узлы, состоящие только из пробельных символов, хотя:

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

Пример вывода

string(6) "x text" 
string(9) "root text" 
string(10) "child text" 
Смежные вопросы