2013-07-03 1 views
0

JUst нужна быстрая помощь. Пусть говорят, у меня есть следующий XML отформатирован следующим образом:Поиск данных XML и преобразование его в CSV

<Solution version="1.0"> 
    <DrillHoles total_holes="238"> 
    <description> 
     <hole hole_id="1"> 
     <hole collar="5720.44, 3070.94, 2642.19" /> 
     <hole toe="5797.82, 3061.01, 2576.29" /> 
     <hole cost="102.12" /> 
     </hole> 
    ........ 

EDIT: Вот код, я использовал, чтобы создать отверстие collar..etc.

for row in reader: 
    if i > 0: 
     x1,y1,z1,x2,y2,z2,cost = row 
     if current_group is None or i != current_group.text: 
      current_group = SubElement(description, 'hole',{'hole_id':"%s"%i}) 

      collar = SubElement (current_group, 'hole',{'collar':', '.join((x1,y1,z1))}), 
      toe = SubElement (current_group, 'hole',{'toe':', '.join((x2,y2,z2))}) 
      cost = SubElement(current_group, 'hole',{'cost':cost}) 
    i+=1 

и т. Д., Как я могу получить отверстие воротника, отверстие для ног и данные о стоимости отверстия. Вот мой фрагмент кода, я думаю, что я действительно близок.

with open(outfile, 'w') as file_: 

    writer = csv.writer(file_, delimiter="\t") 
    for a in zip(root.findall("drillholes/hole/hole collar"), 
      root.findall("drillholes/hole/hole toe"), 
      root.findall("drillholes/hole/hole cost")): 
     writer.writerow([x.text for x in a]) 

Хотя моя программа создает файл CSV файл CSV пуст, поэтому я думаю, что этот кусок коды не удалось получить данные из-за некоторый поиск и поиск ошибок. Может ли кто-нибудь помочь?

ответ

0

Вы не указали, но я предполагаю, что вы используете xml.etree.ElementTree. Здесь есть несколько вопросов:

1) XML чувствителен к регистру. «буровые скважины» - это не то же самое, что «DrillHoles».

2) В вашем пути отсутствует элемент описания, который содержится в вашем XML-документе.

3) Чтобы ссылаться на атрибуты, вы не используете пробел, а другой элемент пути с префиксом «@», как в «воротнике ворот/ворот».

Принимая во внимание тех, кто, ответ должен быть просто так:

for a in zip(root.findall("DrillHoles/description/hole/hole/@collar"), 
       root.findall("DrillHoles/description/hole/hole/@toe"), 
       root.findall("DrillHoles/description/hole/hole/@cost")): 
    writer.writerow([x.text for x in a]) 

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

for a in zip(root.findall("DrillHoles/description/hole/hole[@collar]"), 
       root.findall("DrillHoles/description/hole/hole[@toe]"), 
       root.findall("DrillHoles/description/hole/hole[@cost]")): 
    writer.writerow([x[0].get('collar'), x[1].get('toe'), x[2].get('cost')]) 

Но если вы должны перечислить атрибуты в отчетности в цикл в любом случае, лично я только покончу с молнией и сделать это:

for a in root.findall("DrillHoles/description/hole"): 
    writer.writerow([a.find("hole[@"+attr+"]").get(attr) for attr in ("collar", "toe", "cost")]) 
+0

Так что давайте скажем, если бы у меня не было «дырочки» infront воротника, носок, стоимость, это было бы просто для zip (root.findall («DrillHoles/description/hole/collar»), root.findall («DrillHoles/description/hole/toe»), root.findall («DrillHoles/description/hole/cost»)): writer.writerow ([x.text for x in a]) – Andy

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