Получить местоположение комментария вне элемента в файле XML - Python - PullRequest
1 голос
/ 11 февраля 2020

У меня есть файл XML, 'пример. xml', формат которого похож на следующий:

<ParentOne> <!-- Comment 1-->
   <SiblingOneA>This is Sibling One A</SiblingOneA> 
   <SiblingTwoA> <!-- Comment -->
      <ChildOneA>Value of child one A <!-- Comment 2--></ChildOneA>
      <!-- <break>Comment between tags</break>-->
      <ChildTwoA>Value of child two A</ChildTwoA>
      <ChildThreeA>Value of child three A</ChildThreeA>
      <!-- <break>Another comment between tags</break>-->
      <ChildFourA>Value of child four A</ChildFourA>
   </SiblingTwoA>
</ParentOne>

Как видите, есть некоторые комментарии, соответствующие определенным тегам и другие комментарии, которые находятся между тегами. Я пытаюсь написать что-то, что получит комментарии, которые находятся между тегами и его местоположением.

Например, я хотел бы найти способ, которым мне говорят, что первый "разрыв" комментарий находится между тегами ChildOneA и ChildTwoA. Это мой код:

from lxml import etree

doc = etree.parse('example.xml')
root = doc.getroot()

for tag in doc.xpath('//*'):
   comment = tag.xpath('{0}/comment()'.format(doc.getpath(tag)), namespaces=root.nsmap)
   print(comment)
   # Do some other stuff

Этот код возвращает:

[<!-- Comment 1-->]
[]
[<!-- Comment -->, <!-- <break>Comment between tags</break>-->, <!-- <break>Another comment between tags</break>-->]
[<!-- Comment 2-->]
[]
[]
[]

Я понимаю, почему 3-й элемент в списке, который соответствует SiblingTwoA, возвращает 3 комментария, как 2 перерыва комментарии технически соответствуют этому тегу. Однако есть ли способ узнать, что первый из этих комментариев прерывания находится между тегами ChildOneA и ChildTwoA, а второй - между тегами ChildThreeA и ChildFourA?

Рад уточнить, если это необходимо, так как это может быть немного запутанным, чтобы понять.

1 Ответ

1 голос
/ 11 февраля 2020

Полагаю, вы ищете что-то вроде этого:

for tag in doc.xpath('//*'):
    comment = tag.xpath('./comment()')
    if comment:
        for c in comment: 
            bef = c.xpath('./preceding-sibling::*[1]')
            aft = c.xpath('./following-sibling::*[1]')
            if bef:
                print(c,'is between',bef[0].tag,'and ',aft[0].tag)

Вывод:

<!-- <break>Comment between tags</break>--> is between ChildOneA and  ChildTwoA
<!-- <break>Another comment between tags</break>--> is between ChildThreeA and  ChildFourA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...