-3

检查每个文本节点是否存在于数据库中,如果存在则将一个类添加到其元素节点。

我尝试过以下方式:

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()

4

1 回答 1

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属性并可能返回一个元素。

于 2012-12-18T10:48:40.160 回答