Как сравнить два xpath в python - PullRequest
       17

Как сравнить два xpath в python

0 голосов
/ 08 октября 2011

У меня есть две строки xpath, например:

/Envlope[1]/Header[1]/transactionInfo[1]/id[1]

и

/Envelope/Header/*

Как я могу сравнить (сопоставить) этот xpaht? Как я могу сделать это на Python или какой алгоритм лучше использовать?

Пример:

<?xml version="1.0" encoding="utf-8"?>
<Envelope>
    <Header>
        <transactionInfo>
            <id>31234</id>
        </transactionInfo>
    </Header>
    <Body>
        <message>test_31234</message>
    </Body>
</Envelope>

Ожидаемое:

/Envlope[1]/Header[1]/transactionInfo[1]/id[1] в /Envelope/Header/*

/Envlope[1]/Body[1]/message[1] не в /Envelope/Header/*

/Envlope[1]/Header[1] не в /Envelope/Header/*

1 Ответ

1 голос
/ 08 октября 2011

Использование lxml :

import lxml.etree as ET

def is_descendant(tree,path1,path2):
    elt1=tree.xpath(path1)[0]
    elt2=tree.xpath(path2+'/descendant::*')
    return elt1 in elt2

content='''\
<?xml version="1.0" encoding="utf-8"?>
<Envelope>
    <Header>
        <transactionInfo>
            <id>31234</id>
        </transactionInfo>
    </Header>
    <Body>
        <message>test_31234</message>
    </Body>
</Envelope>
'''

tests=[
    ('/Envelope[1]/Header[1]/transactionInfo[1]/id[1]','/Envelope/Header/*'),
    ('/Envelope[1]/Body[1]/message[1]','/Envelope/Header/*'),
    ('/Envelope[1]/Header[1]','/Envelope/Header/*')    
    ]

tree=ET.fromstring(content)
for path1,path2 in tests:
    if is_descendant(tree,path1,path2):
        print('{p1} in {p2}'.format(p1=path1,p2=path2))
    else:
        print('{p1} NOT in {p2}'.format(p1=path1,p2=path2))

дает

/Envelope[1]/Header[1]/transactionInfo[1]/id[1] in /Envelope/Header/*
/Envelope[1]/Body[1]/message[1] NOT in /Envelope/Header/*
/Envelope[1]/Header[1] NOT in /Envelope/Header/*

PS.Обратите внимание, что символ == обычно зарезервирован для симметричных отношений: если X == Y, то Y == X.В этом случае вы, похоже, ищете асимметричные отношения: Y содержит X.Поэтому, возможно, вместо этого используйте или какой-нибудь такой символ или фразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...