2015-06-19 3 views
0

Я хотел бы получить данные от каждого родителя и их собственных детей из файла XML.Анализ XML-файлов - получение данных от каждого родителя и их собственных детей

Я пытаюсь разобрать этот XML-файл

<DB> 
    <Entry> 
     <Name>Assembly.iam</Name> 
     <DisplayName>Assembly.iam</DisplayName> 
     <Scalar> 
      <Name>d0</Name> 
      <DisplayName>d0 (value = 0 mm)</DisplayName> 
      <Value>0</Value> 
     </Scalar> 
     <Scalar> 
      <Name>d1</Name> 
      <DisplayName>d1 (value = 0 mm)</DisplayName> 
     <Value>0</Value> 
     </Scalar> 
    </Entry> 
    <Entry> 
     <Name>Ground.ipt</Name> 
     <DisplayName>Ground.ipt</DisplayName> 
     <Scalar> 
      <Name>Ground_length</Name> 
      <DisplayName>Ground_length (value = 160 mm)</DisplayName> 
      <Value>160</Value> 
     </Scalar> 
     <Scalar> 
      <Name>d2</Name> 
      <DisplayName>d2 (value = 80 mm)</DisplayName> 
      <Value>80</Value> 
     </Scalar> 
    </Entry> 
</DB> 

На самом деле, я хотел бы получить данные, которые в <DisplayName></DisplayName>. Тогда, я хотел бы поместить эти данные в массив кортежей, как этот

[(Assembly.iam,[d0 (value = 0 mm), d1 (value = 0 mm)]), 
(Ground.ipt,[Ground_length (value = 160 mm), d2 (value = 80 mm)]) 

Я попытался использовать xml.etree.cElementTree библиотеку с этим кодом

from xml.etree import cElementTree 
import numpy as np 

workingDir = "C:/Users/Vince/Test" 
newStrWorkingDir = str.replace(workingDir, '/', '\\') 
tree = cElementTree.parse(newStrWorkingDir + "\\test.xml") 
root = tree.getroot() 
tab = np.empty(shape=(0, 0)) 
tabEntry = np.empty(shape=(0, 0)) 
tabScalar = np.empty(shape=(0, 0)) 

for entry in root.findall('Entry'): 
    entryNames = entry.findall("./DisplayName") 
    entryNamesText = entry.find("./DisplayName").text 
    tabEntry = np.append(tabEntry,entryNamesText) 
    for scalar in entry.findall('Scalar'): 
     scalarNames = scalar.findall("./DisplayName") 
     scalarNamesText = scalar.find("./DisplayName").text 
     tabScalar = np.append(tabScalar,scalarNamesText) 
     tab = np.append(tab,(entryNamesText,scalarNamesText)) 

print(tab) 

Но он выводит меня это

['Assembly.iam' 'd0 (value = 0 mm)' 
'Assembly.iam' 'd1 (value = 0 mm)' 
'Ground.ipt' 'Ground_length (value = 160 mm)' 
'Ground.ipt' 'd2 (value = 80 mm)'] 
+0

Почему вы используете 'numpy'? – Daniel

+1

Потому что я обычно использую это, но мабы сложнее использовать это, чем классические массивы. – Vincent

ответ

1

Чтобы получить необходимую структуру, вам необходимо создать списки списков:

import os 
from xml.etree import cElementTree 

workingDir = "C:\\Users\\Vince\\Test" 
tree = cElementTree.parse(os.path.join(newStrWorkingDir, "test.xml")) 
root = tree.getroot() 
tab = [] 

for entry in root.findall('Entry'): 
    entry_name = entry.findtext("./DisplayName") 
    scalar_names = [e.text for e in entry.findall('Scalar/DisplayName')] 
    tab.append((entry_name, scalar_names)) 
print(tab) 
Смежные вопросы