Анализ файла XML для извлечения родителей в соответствии с дочерним элементом - PullRequest
0 голосов
/ 27 февраля 2019

Я хотел бы проанализировать xml-файл, вот мой xml-файл:

<group>
  <name>Services</name>
  <file>
    <name>Path\File1.c</name>
  </file>
  <file>
    <name>Path\File2.c</name>
    <excluded>
      <configuration>Configuration1</configuration>
      <configuration>Configuration2</configuration>
    </excluded>
  </file>
  <file>
    <name>Path\File3.c</name>
    <excluded>
      <configuration>Configuration2</configuration>
      <configuration>Configuration3</configuration>
    </excluded>
  </file>
  <file>
    <name>Path\File4.c</name>
  </file>
</group>

Этот xml-файл описывает файл, используемый в проекте.Этот проект имеет несколько Конфигурация с именами от Конфигурация1 до Конфигурация4 .Для примера предположим, что у меня есть доступ к ним благодаря списку конфигурационных имен.В файле xml перечислены все файлы, используемые в проекте, каждый файл находится в каждой конфигурации , если только он не указан ниже имени файла, конфигурация находится в тегах исключенных

Чего я хотел бы добиться, так это функции, которая:

  • Учитывая дерево xml, имя конфигурации вернет список всех файлов, используемых в этой конфигурации.

Я успешно получил все файлы, вот мой код:

from lxml import etree

def getSourceFile(sTree, szConfigName):
  #retrieve every file used in the project
  lSource = []
  for data in sTree.xpath('/group'):
      file = data.findall("file")
      for x in file:
        for element in x:
          if(element.tag == "name"):          
              lSource.append(element.text)
  print(lSource)

if __name__ == '__main__':
  sTree = etree.parse("myXmlFile.xml")
  lConfigName = ["Configuration1", "Configuration2", "Configuration3", "Configuration4"]

  for iIdxConfig in range(0, len(lConfigName)):
    getSourceFile(sTree, lConfigName[iIdxConfig])
    print("\n\n")

Я не знаю, как я могу продолжить проверку каждого файла, если текущая конфигурация исключает этот файл.

1 Ответ

0 голосов
/ 27 февраля 2019

Я не совсем понимаю, что вы действительно хотите сделать, но, возможно, этот фрагмент может помочь вам

from lxml import etree

def getSourceFile(sTree, szConfigName):
#retrieve every file used in the project
lSource = []
for data in sTree.xpath('/group'):
  file = data.findall("file")
  for x in file:
    myName = ""
    confIsExcluded=False
    for element in x:
      if(element.tag == "name"):
        myName = element.text
      if(element.tag == "excluded"):
        configurations = [config.text for config in element.findall("configuration")]
        if(szConfigName in configurations):
          confIsExcluded=True
    if(not confIsExcluded):
      lSource.append(myName)
print(lSource)

if __name__ == '__main__':
  sTree = etree.parse("myXmlFile.xml")
  lConfigName = ["Configuration1", "Configuration1", "Configuration2", "Configuration3"]

  for iIdxConfig in range(0, len(lConfigName)):
  getSourceFile(sTree, lConfigName[iIdxConfig])
  print("\n\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...