2011-01-20 81 views
1

有没有办法检查与lxml库相等的节点?例如,在PHP的DOMDocument有isSameNodelxml节点比较

a->isSameNode(b) //return boolean 

我需要做的是这样的:

def find_special_node(special_node, xml): 
    #iterating nodes in xml 
    if node == special_node: 
     return node 

回答

0

不知道要检查NodeA is NodeBNodeA == NodeB

你可以试试:

for node in X.iter(): 
    if node == special_node: # maybe "node is special_node" ? 
     return node 

无论如何,既然你已经有special_node,你为什么要搜索它?

+0

例如,我需要检查我的'special_node`是否在`xml`中。但无论如何,我需要知道是否有类似于php`isSameNode` – nukl 2011-01-20 08:01:36

1

您可能可以使用xpath来查找该项目,使用“special_node”的属性作为find()中的必需属性(和值)。我认为两个节点被确定为是相同的,如果节点的所有属性都相同(如类型,值,大小等)
只是一个猜测

我的实现:

import lxml.etree as etree 
def isSameNode(a,b,tagsame=True): 
    for attrib in a.attrib: 
     if a.get(attrib) != b.get(attrib): 
      print a.get(attrib),b.get(attrib) 
      return False 
     else: 
      return False 
    if a.text != b.text: 
     return False 
    if tagsame==True: 
     if a.tag != b.tag: 
      return False 
    if a.prefix != b.prefix: 
     return False 
    if a.tail != b.tail: 
     return False 
    if a.values()!=b.values(): #may be redundant to the attrib matching 
     return False 
    if a.keys() != b.keys(): #may also be redundant to the attrib matching 
     return False 
    return True 

def find_alike(xml,special_element,tagsame=True): 
    tree = etree.fromstring(xml) 
    for node in tree.iter(): 
     if isSameNode(node,special_element,tagsame): 
      return node 
    return None