php DomDocument:匹配每个nodeValue,如果条件满足,则将属性添加到其nodeName

时间:2012-12-18 10:37:29

标签: domdocument php

检查每个文本节点是否存在于DataBase中,如果确实存在,则将类添加到其Element节点。

我尝试过以下方式:

function extractText($node) {
    if (XML_TEXT_NODE === $node->nodeType || XML_CDATA_SECTION_NODE === $node->nodeType) {

// am considering that Login is the word that exists in DB
            if ($node->nodeValue == "Login"): 
                $node->setAttribute("class", "translated");
                return $node->nodeName;
            endif;
        } else if (XML_ELEMENT_NODE === $node->nodeType || XML_DOCUMENT_NODE === $node->nodeType
                || XML_DOCUMENT_FRAG_NODE === $node->nodeType) {
            if ('script' === $node->nodeName || 'style' === $node->nodeName)
                return '';

        $text = '';
        foreach ($node->childNodes as $childNode) {
            $text .= extractText($childNode);
        }
        return $text;
    }
}

$doc = new DomDocument;
$doc->loadHTMLFile('test.html');

//var_dump(extractText($doc->getElementsByTagName('body')->item(0)));
echo extractText($doc->getElementsByTagName('body')->item(0));

但它会给出错误信息。

致命错误:调用未定义的方法DOMText :: setAttribute()

1 个答案:

答案 0 :(得分:2)

  

致命错误:调用未定义的方法DOMText :: setAttribute()

好吧,让我们来看看代码。

if (XML_TEXT_NODE === $node->nodeType || XML_CDATA_SECTION_NODE === $node->nodeType) {
// am considering that Login is the word that exists in DB
    if ($node->nodeValue == "Login"): 
        $node->setAttribute("class", "translated");
        return $node->nodeName;
    endif;
} /* else ... */

您要求专门处理文本或CDATA节点,然后您尝试在文本上设置属性....这不行。文本节点不能具有属性。

您需要访问包含文本的元素并在其中添加属性。由于DOMText继承自DOMNode,因此您可以检查parentNode属性,可能获取元素。