2015-09-04 2 views
0

Итак, у меня есть большой XML-файл с данными, которые я разбираю. Пример приведен ниже:Как выполнить итерацию через ElementTree и удалить все теги <mark>?

<statement> 
<plist> 
<p>Hello Stack Overflow.</p> 
<p>This doesn't <mark type="NA" /> seem to work!</p> 
</plist> 
</statement> 

Программа Я разработал только возвращает «Привет Stack Overflow Это не» Для того, чтобы разобрать остальную часть строки Я хотел бы, чтобы удалить метки метки на перед тем разбор. Используя функцию root.findall ('.// ​​mark'), я смог найти метки, но root.remove (метки), когда цикл с возвратом функции findall не работает, потому что путь от корня к этим тегам неизвестен , Я также попытался найти все экземпляры p-тегов и найти их для меток-меток, а затем удалить их с помощью «p-тега» .remove («tag tag»), это не провалилось, но, похоже, не работало. Какие-либо предложения?

Это не дублирование всего, что требует импорта lxml, так как это может иметь отношения NO и должно быть разрешено с использованием только функциональности дерева элементов.

+0

Чтобы удалить элемент, вам, очевидно, необходимо знать * parent * элемента. Просмотрели ли вы методы, доступные в элементе 'ElementTree'? – larsks

+0

Да, прямой доступ к родительскому узлу отсутствует. Но, как я уже говорил, все теги отметок находятся в тексте, заключенном p-тегами. Поэтому, повторяя все теги p и проверяя, включен ли «метка», я мог найти родительский узел (тэг p) и использовать его для удаления метки метки. Однако после того, как я закончу это и попытаюсь разобрать текст, текст все же отключается в точке, где был отмечен тег метки (или все еще есть). Так что я немного потерял. – JJJ1106

+0

Существует * прямой доступ к родительскому узлу. – larsks

ответ

0

ElementTree анализирует текст перед отметкой </> в атрибут 'text' содержащего p-тега и текст после него в атрибут 'tail' тега метки.

Решение состоит в том, чтобы найти теги p, заглянуть внутрь их для меток метки и перед удалением метки добавить свое значение хвоста в текст содержащего p.