Использование 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
.Поэтому, возможно, вместо этого используйте ⊆
или какой-нибудь такой символ или фразу.