2016-07-25 3 views
0

私はPythonでXMLファイルをリストに解析しようとしています。私はこのサイトと他のサイトのいくつかのソリューションを見てきて、それらを私のために働かせることができませんでした。私はそれをすることができましたが、面倒な方法で私にはばかげているようです。より簡単な方法があるはずです。XMLファイルをリストに解析する方法は?

私のニーズに合うように他の人々のコードを適合させようとしましたが、私が読んでいるものが必ずしも確実ではないので、それは機能しません。

これはXMLファイルです:

<?xml version="1.0"?> 
<configuration> 
    <location name ="location"> 
     <latitude>54.637348</latitude> 
     <latHemi>N</latHemi> 
     <longitude>5.829723</longitude> 
     <longHemi>W</longHemi> 
    </location> 
    <microphone name="microphone"> 
     <sensitivity>-26.00</sensitivity> 
    </microphone> 
    <weighting name="weighting"> 
     <cWeight>68</cWeight> 
     <aWeight>2011</aWeight> 
    </weighting> 
    <optionalLevels name="optionalLevels"> 
     <L95>95</L95> 
     <L90>90</L90> 
     <L50>50</L50> 
     <L10>10</L10> 
     <L05>05</L05> 
     <fmax>fmax</fmax> 
    </optionalLevels> 
    <averagingPeriod name="averagingPeriod"> 
     <onemin>1</onemin> 
     <fivemin>5</fivemin> 
     <tenmin>10</tenmin> 
     <fifteenmin>15</fifteenmin> 
     <thirtymin>30</thirtymin> 
    </averagingPeriod> 
    <timeWeighting name="timeWeighting"> 
     <fast>fast</fast> 
     <slow>slow</slow> 
    </timeWeighting> 
    <rebootTime name="rebootTime"> 
     <midnight>midnight</midnight> 
     <sevenAm>7am</sevenAm> 
     <sevenPm>7pm</sevenPm> 
     <elevenPm>23pm</elevenPm> 
    </rebootTime> 
    <remoteUpload name="remoteUpload"> 
     <nointernet>nointernet</nointernet> 
     <vodafone>vodafone</vodafone> 
    </remoteUpload> 
</configuration> 

そして、これはPythonプログラムです。

#!/usr/bin/python 
import xml.etree.ElementTree as ET 


import os 
try: 
    import cElementTree as ET 
except ImportError: 
    try: 
     import xml.etree.cElementTree as ET 
    except ImportError: 
     exit_err("Failed to import cElementTree from any known place") 

file_name = ('/home/mark/Desktop/Practice/config_settings.xml') 
full_file = os.path.abspath(os.path.join('data', file_name)) 

dom = ET.parse(full_file) 

tree = ET.parse(full_file) 
root = tree.getroot() 

location_settings = dom.findall('location') 
mic_settings = dom.findall('microphone') 
weighting = dom.findall('weighting') 
olevels = dom.findall('optionalLevels') 
avg_period = dom.findall('averagingPeriod') 
time_weight = dom.findall('timeWeighting') 
reboot = dom.findall('rebootTime') 
remote_upload = dom.findall('remoteUpload') 

for i in location_settings: 

    latitude = i.find('latitude').text 
    latHemi = i.find('latHemi').text 
    longitude = i.find('longitude').text 
    longHemi = i.find('longHemi').text 


for i in mic_settings: 
    sensitivity = i.find('sensitivity').text 

for i in weighting: 
    cWeight = i.find('cWeight').text 
    aWeight = i.find('aWeight').text 

for i in olevels: 
    L95 = i.find('L95').text 
    L90 = i.find('L90').text 
    L50 = i.find('L50').text 
    L10 = i.find('L10').text 
    L05 = i.find('L05').text 

for i in avg_period: 
    onemin = i.find('onemin').text 
    fivemin = i.find('fivemin').text 
    tenmin = i.find('tenmin').text 
    fifteenmin = i.find('fifteenmin').text 
    thirtymin = i.find('thirtymin').text 

for i in time_weight: 
    fast = i.find('fast').text 
    slow = i.find('slow').text 

for i in reboot: 
    midnight = i.find('midnight').text 
    sevenAm = i.find('sevenAm').text 
    sevenPm = i.find('sevenPm').text 
    elevenPm= i.find('elevenPm').text 

for i in remote_upload: 
    nointernet = i.find('nointernet').text 
    vodafone = i.find('vodafone').text 

config_list = [latitude,latHemi,longitude,longHemi,sensitivity,aWeight,cWeight, 
       L95,L90,L50,L10,L05,onemin,fivemin,tenmin,fifteenmin,thirtymin, 
       fast,slow,midnight,sevenAm,sevenAm,elevenPm,nointernet,vodafone] 
print(config_list) 
+0

ようこそStackOverflow。 XMLから構文解析したい出力を記述してください。あなたはそれを含むようにあなたのクエスチョンを編集することができます –

+0

あなたはどんな種類のリストを予期していますか?トップレベル要素の単一のフラットリスト?リストのリスト? –

答えて

2

あなたがポーズをとっている問題は非常によく定義されていないです。 XML構造は、最初にリスト構造に適合しません。もしあなたがPythonに慣れていないのであれば、あなたがしようとしていることを実行する最善の方法は、xmltodictのようなものをあなたのxml内の暗黙的なスキーマをpythonのデータ構造に解析することです。

import xmltodict 
xml = """<?xml version="1.0"?> 
<configuration> 
    <location name ="location"> 
     <latitude>54.637348</latitude> 
     <latHemi>N</latHemi> 
     <longitude>5.829723</longitude> 
     <longHemi>W</longHemi> 
    </location> 
    <microphone name="microphone"> 
     <sensitivity>-26.00</sensitivity> 
    </microphone> 
    <weighting name="weighting"> 
     <cWeight>68</cWeight> 
     <aWeight>2011</aWeight> 
    </weighting> 
    <optionalLevels name="optionalLevels"> 
     <L95>95</L95> 
     <L90>90</L90> 
     <L50>50</L50> 
     <L10>10</L10> 
     <L05>05</L05> 
     <fmax>fmax</fmax> 
    </optionalLevels> 
    <averagingPeriod name="averagingPeriod"> 
     <onemin>1</onemin> 
     <fivemin>5</fivemin> 
     <tenmin>10</tenmin> 
     <fifteenmin>15</fifteenmin> 
     <thirtymin>30</thirtymin> 
    </averagingPeriod> 
    <timeWeighting name="timeWeighting"> 
     <fast>fast</fast> 
     <slow>slow</slow> 
    </timeWeighting> 
    <rebootTime name="rebootTime"> 
     <midnight>midnight</midnight> 
     <sevenAm>7am</sevenAm> 
     <sevenPm>7pm</sevenPm> 
     <elevenPm>23pm</elevenPm> 
    </rebootTime> 
    <remoteUpload name="remoteUpload"> 
     <nointernet>nointernet</nointernet> 
     <vodafone>vodafone</vodafone> 
    </remoteUpload> 
</configuration>""" 
d = xmltodict.parse(xml) 
0

コメントありがとうございます。ご質問がうまくいかない場合は申し訳ありません。私は自分自身で答えを見つけました。 XMLの子要素を後で別のプログラムで使用するためのリストに解析することを検討していました。私はそれを考え出した。お待ちいただいてありがとうございます。

関連する問題