Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检测一个元素的直接同级是文本还是lxml中的另一个元素_Python_Xml_Python 2.7_Lxml - Fatal编程技术网

Python 检测一个元素的直接同级是文本还是lxml中的另一个元素

Python 检测一个元素的直接同级是文本还是lxml中的另一个元素,python,xml,python-2.7,lxml,Python,Xml,Python 2.7,Lxml,我正在使用lxml库和python2.7解析xml文件。我需要检测是否兄弟元素之间没有任何文本。例如,在以下xml部分: <cross-ref> [t1] </cross-ref> ***some text*** <cross-ref> [t2] </cross-ref> <cross-ref> [t3] </cross-ref><cross-ref> [t4] </cross-ref> 我需要

我正在使用lxml库和python2.7解析xml文件。我需要检测是否兄弟元素之间没有任何文本。例如,在以下xml部分:

<cross-ref> [t1] </cross-ref> ***some text*** <cross-ref> [t2] </cross-ref>  
<cross-ref> [t3] </cross-ref><cross-ref> [t4] </cross-ref>

我需要修改它,使输出仅为
[t3]

我使用tail属性解决了这个问题。当c.tail为None时,我可以说to元素之间没有文本。代码如下所示:

for c in cross_refs:
    if c.getnext() != None:
        if c.getnext().tag == c.tag:
            if c.tail == None:
                print c.text

答案中的三重嵌套
if
s也可以用XPath表示,如下所示:

following-sibling::node()[1][self::cross-ref]
for c in cross_refs:
    if c.xpath('boolean(following-sibling::node()[1][self::cross-ref])'):
        print c.text
简而言之,只有当XPath是
cross-ref
元素时,它才会返回最近的后续同级节点。请注意,这里的节点表示文本节点或元素节点。XPath可以按如下方式使用:

following-sibling::node()[1][self::cross-ref]
for c in cross_refs:
    if c.xpath('boolean(following-sibling::node()[1][self::cross-ref])'):
        print c.text
或者,如果愿意,您可以首先获得符合此标准的
交叉引用
元素:

cross_refs = tree.xpath('//cross-ref[following-sibling::node()[1][self::cross-ref]]')
for c in cross_refs:
    print c.text

如果不区分文本和元素,那么使用此代码有什么意义?主要问题是,我不希望将它们之间有文本的元素检测为兄弟元素。可能我不清楚。我的意思是,下面的位“不区分文本和元素”:
后面的同级::node()[1]
,但接下来的位只进一步过滤到
交叉引用
元素:
[self::交叉引用]
。因此,如果下一个
cross-ref
元素直接位于当前
cross-ref
之后,则整个表达式将返回下一个
cross-ref
元素,然后可以使用该元素解决您遇到的问题mentioned@AliGH:使用har07的XPath,您可以使用
[elt.text for elt in tree.XPath('//cross-ref[following sibling::*[1][self::cross ref]]”如果elt.tail为None]