сравнение узлов lxml - PullRequest
       11

сравнение узлов lxml

1 голос
/ 20 января 2011

Есть ли способ проверить узлы, совпадающие с библиотекой lxml?Например, в php DOMDocument есть isSameNode:

a->isSameNode(b) //return boolean

Мне нужно сделать что-то вроде этого:

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

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Вы можете использовать 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
0 голосов
/ 20 января 2011

Не уверен, если вы хотите проверить NodeA is NodeB или NodeA == NodeB

Вы можете попробовать:

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

В любом случае, поскольку у вас уже есть special_node, зачем вам его искать?

...