Използвам 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