XML parsing in Python: 如何获取 child 节点的字符串索引关于扁平字符串

XML parsing in Python: how to get the string indexes of child nodes with regard to the flattened string

我是 XML 解析 Python 的新手,我需要获取一些关于某些短语节点及其 children 的内部文本的数据(最好使用 Minidom,但这不是必需的)。

示例:

<phrase id="x.y">This example
    <foo id="x.y.z">
        <bar type="likelihood" ref="x.y.z">might</bar> 
    be useful</foo>.
</phrase>

我要获取的是以下数据:

在 xml 示例中,<bar> 内部文本( 可能 )从索引 14 开始到索引 18 结束,而 <foo> contents (be useful) 从索引 19 开始到索引 28 结束。这个例子的执行应该 return 类似的东西(children 的顺序是无关紧要):

('This example might be useful.', [('bar', 14, 18), ('foo', 19, 28)])

这是一个有趣的项目!有点令人费解,不确定在其他情况下会走多远,但请尝试这样的事情:

from lxml import etree
phrase = """[your xml above]"""
doc = etree.fromstring(phrase)

#this requires a couple of help functions to clean up spaces, find indexes, etc.:

def space_rem(str):
    while '  ' in str:
        str = str.replace('  ', ' ')
    return str

def build(str):
    str_path = doc.xpath(f'//{str}/text()')
    str = ''
    for s in str_path:
        str+=(s.strip())
    space_rem(str)
    str_ind = ttxt.find(str)
    return str_ind,str_ind+len(str)

foo_lst = ['foo']
bar_lst = ['bar']
ttxt = ''

for t in doc.xpath('//*/text()'):
    ttxt+=t.replace('\n','')
ttxt = space_rem(ttxt)

foo_lst.extend(build('foo'))
bar_lst.extend(build('bar'))

ttxt,foo_lst,bar_lst

输出:

('This example might be useful.', ['foo', 19, 28], ['bar', 13, 18])