2013-09-04 2 views
0

У меня есть xml-файл, содержащий структуру каталогов для файлов, которые я хочу поместить в файл tar.gz (сплющенный).Как разобрать xml-файл со структурой каталогов

Как следует анализировать xml для извлечения пути для каждого файла?

Сейчас я использую LXML и найти пути, как это:

paths = [] 
for case in root.iter('case'): 
    for language in case.iter('language'): 
     for result in language.iter('result'): 
      for file in result.iter('file'): 
       paths.append('/'.join([node.get('id') for node in [case, language, result, file]])) 

Но это чувствует себя немного слишком жёстко, и это не работает хорошо, если изменение структуры.

Я могу найти каждый файл-узел с помощью root.iter ('file'), но как я могу получить все родители/каталоги для каждого узла/файла? Или я должен делать это (полностью?) По-другому?

XML-выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<files batch="regular"> 
    <case id="case_10_some_description"> 
     <language id="english"> 
      <result id="images"> 
       <file id="screenshot_1.png"/> 
       <file id="screenshot_2.png"/> 
       <file id="screenshot_3.png"/> 
       <file id="screenshot_4.png"/> 
       <file id="screenshot_5.png"/> 
       <file id="screenshot_6.png"/> 
      </result> 
     </language> 
    </case> 
    <case id="case_12_some_description"> 
     <language id="english"> 
      <result id="images"> 
       <file id="screenshot_1.png"/> 
       <file id="screenshot_2.png"/> 
       <file id="screenshot_3.png"/> 
      </result> 
     </language> 
    </case> 
</files> 

И это файлы:

regular/case_10_some_description/english/images/screenshot_1.png 
regular/case_10_some_description/english/images/screenshot_2.png 
regular/case_10_some_description/english/images/screenshot_3.png 
regular/case_10_some_description/english/images/screenshot_4.png 
regular/case_10_some_description/english/images/screenshot_5.png 
regular/case_10_some_description/english/images/screenshot_6.png 
regular/case_12_some_description/english/images/screenshot_1.png 
regular/case_12_some_description/english/images/screenshot_2.png 
regular/case_12_some_description/english/images/screenshot_3.png 
+0

Я написал этот пакет питона для управления эволюционирует шаблоны структуры каталогов ... https://github.com/robmoggach/python-dirtt – mogga

ответ

1

ли вы создать этот файл-схему по своему усмотрению? Если вы можете изменить его, я бы определенно. Попробуйте сделать что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?> 
<Directory id="regular"> 
    <Directory id="case_10_some_description"> 
     <Directory id="english"> 
      <Directory id="images"> 
       <file id="screenshot_1.png"/> 
       <file id="screenshot_2.png"/> 
       <file id="screenshot_3.png"/> 
       <file id="screenshot_4.png"/> 
       <file id="screenshot_5.png"/> 
       <file id="screenshot_6.png"/> 
      </Directory> 
     </Directory> 
    </Directory> 
    <Directory id="case_12_some_description"> 
     <Directory id="english"> 
      <Directory id="images"> 
       <file id="screenshot_1.png"/> 
       <file id="screenshot_2.png"/> 
       <file id="screenshot_3.png"/> 
      </Directory> 
     </Directory> 
    </Directory> 
</Directory> 

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

+0

Нет к сожалению, нет: \ Во всяком случае, это хороший совет, спасибо. – kristus

0
import xml.etree.ElementTree as ET 
tree = ET.parse('sample.xml') 
root = tree.getroot() 
for file in root.iter('file'): 
    print 'regular/case_10_some_description/english/images/'+file.attrib['id'] 
+0

Спасибо за ответ, но это более жестко, чем решение, от которого я хочу избавиться. Это работает только для первого случая. – kristus

Смежные вопросы