首页 > 解决方案 > DOMNode::isEqualNode():尚未实现

问题描述

我在 php 中创建了这个函数来检查父 XML 是否已经有一个 xml 来插入它:

function has_xml_node( \DOMElement $needle, \DOMElement $node ) {
    if( $node->hasChildNodes() ){
        foreach ( $node->childNodes as $childNode ) {
            if( $needle->isEqualNode( $childNode ) ){
                return true;
            }
        }
    }
    return false;
}

我收到了这个 php 错误:

DOMNode::isEqualNode(): 尚未在...中实现

我怎样才能解决这个问题 ?

标签: phpxml

解决方案


我在这里找到了解决方案。

利用$needle->isSameNode( $childNode );

但它似乎也检查'baseURI'了,所以如果你有两个相同的标签但来自不同的 xml 文件,请$needle->isSameNode( $childNode );返回false.

我做了一个函数来解决这个问题。

function is_same_node( \DOMNode $node_to_compare, \DOMNode $node_refered, $with_attributes = true ) {
    if( $node_to_compare->tagName !== $node_refered->tagName   )
        return false;
    if( $node_to_compare->nodeValue !== $node_refered->nodeValue   )
        return false;
    if( $node_to_compare->prefix !== $node_refered->prefix   )
        return false;
    if( $with_attributes ){
        if( !$node_to_compare->hasAttributes() && $node_refered->hasAttributes() ){
            return false;
        }else{
            if( !$node_refered->hasAttributes() && $node_to_compare->hasAttributes() ){
                return false;
            }else{
                foreach ( $node_to_compare->attributes as $attribute ){
                    $find_attribute_with_same_value = false;
                    foreach ( $node_refered->attributes as $attribute_refered ){
                        if(
                            $attribute_refered->name === $attribute->name
                            && ( $attribute_refered->value === $attribute->value )
                        ){
                            $find_attribute_with_same_value = true;
                        }
                    }
                    if( !$find_attribute_with_same_value )
                        return false;
                }
            }
        }
    }
    return true;
} 

推荐阅读