/ / Открийте дали непосредствената сестра на даден елемент е текст или друг елемент в lxml - python, xml, python-2.7, lxml

Открийте дали непосредственият сестра на елемент е текст или друг елемент в lxml - python, xml, python-2.7, lxml

Използвам lxml библиотека и Python 2.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>

като казвам, че откривам всички елементи с кръстосано рефтагове, имам нужда от един начин, който открива само кръстосани реф елементи на втора линия, които втория елемент идва след първия, без текст между тях. Така че предполагам, че нещо като folloing за линия е необходимо, но очевидно този код отпечатва и двете [t1] и [t3]

for c in cross_refs:
# detect ***some text*** or do something else here
if c.getnext().tag == "cross-ref":
print c.text

Трябва да го променя, така че продукцията ще бъде само [t3].

Отговори:

2 за отговор № 1

Тройният вложени ifв отговора ви може да бъде изразено и в XPath, както следва:

following-sibling::node()[1][self::cross-ref]

Накратко, XPath връща най-близкия следващ близнак възел само ако е така cross-ref елемент. Забележи това възел тук означава или текстов възел или елементен възел, XPath може да се използва както следва:

for c in cross_refs:
if c.xpath("boolean(following-sibling::node()[1][self::cross-ref])"):
print c.text

Или можете да получите само cross-ref елементи, които отговарят на този критерий на първо място, ако искате:

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

0 за отговор № 2

Реших проблема с използването на опашката. Когато терминалът е Никакъв, тогава мога да кажа, че към елементите са прикрепени без текст между тях. Кодът е по следния начин:

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