Пропуск "вложенных тегов" при разборе XML с Python - PullRequest
0 голосов
/ 17 января 2020

В настоящее время у меня есть файл XML, который я хотел бы проанализировать с Python. Я использую Python Element Tree, и он отлично работает, за исключением того, что у меня возник вопрос.

Файл в настоящее время выглядит примерно так:

<Instance>
  <TextContent>
    <Sentence>Hello, my name is John and his <Thing>name</Thing> is Tom.</Sentence>
  </TextContent>
<Instance>

Что я в основном хочу сделать, это пропустите вложенные теги внутри тега <Sentence> (т.е. <Thing>). Один из способов, который я нашел, - это получить текстовое содержимое вплоть до тега, текстовое содержимое тега и объединить их. Код, который я использую:

import xml.etree.ElementTree as ET


xtree = ET.parse('some_file.xml')
xroot = xtree.getroot()

for node in xroot:
    text_before = node[0][0].text
    text_nested = node[0][0][0].text
  1. Как получить часть текста, которая идет после вложенного тега?
  2. Еще лучше, есть ли способ, который Могу ли я полностью игнорировать вложенный тег?

Заранее спасибо.

1 Ответ

1 голос
/ 18 января 2020

Я немного изменил ваш исходный файл XML, так что Предложение содержит два дочерних элемента:

<Instance>
  <TextContent>
    <Sentence>Hello, my <Thing>name</Thing> is John and his <Thing>name</Thing> is Tom.</Sentence>
  </TextContent>
</Instance>

Чтобы найти Предложение элемент, выполните: st = xroot.find('.//Sentence').

Затем определите следующий генератор:

def allTextNodes(root):
    if root.text is not None:
        yield root.text
    for child in root:
        if child.tail is not None:
            yield child.tail

Чтобы просмотреть список всех текстовых узлов прямого потомка, выполните:

lst = list(allTextNodes(st))

Результат:

['Hello, my ', ' is John and his ', ' is Tom.']

Но чтобы получить объединенный текст как одну переменную, запустите:

txt = ''.join(allTextNodes(st))

получив: Hello, my is John and his is Tom. (обратите внимание на двойные пробелы, " окружающие "оба опущены Вещи элементов.

...