1

数日前から xml ファイルからデータを解析しようとしていますが、うまくいきません。以下の例から、レイヤーごとのステータス、インデックス、およびフォアグラウンド/プロデューサーのタイプとファイル名の下から必要です。問題は、コンテンツによって構造が異なることです。ファイル名がフォアグラウンド/プロデューサー/フィル/プロデューサーの下にあるインデックス 2 を見てください (フォアグラウンド/プロデューサー/キー/プロデューサーの下にファイル名は必要ありません)。私は簡単な解決策を探しています(etree.ElementTreeで試していますが、解析はとても難しいようです)。

<?xml version="1.0" encoding="utf-8"?>
<channel>
   <video-mode>1080i5000</video-mode>
   <stage>
      <layers>
         <layer>
            <status>stopped</status>
            <auto_delta>-1</auto_delta>
            <frame-number>1829997</frame-number>
            <nb_frames>0</nb_frames>
            <frames-left>-1829996</frames-left>
            <foreground>
               <producer>
                  <type>empty-producer</type>
               </producer>
            </foreground>
            <background>
               <producer>
                  <type>transition-producer</type>
                  <source>
                     <producer>
                        <type>empty-producer</type>
                     </producer>
                  </source>
                  <destination>
                     <producer>
                        <type>ffmpeg-producer</type>
                        <filename>media\\MULTI\testfile2.mpg</filename>
                        <width>1920</width>
                        <height>1080</height>
                        <progressive>true</progressive>
                        <fps>25</fps>
                        <loop>false</loop>
                        <frame-number>0</frame-number>
                        <nb-frames>4396</nb-frames>
                        <file-frame-number>0</file-frame-number>
                        <file-nb-frames>4396</file-nb-frames>
                     </producer>
                  </destination>
               </producer>
            </background>
            <index>0</index>
         </layer>
         <layer>
            <status>playing</status>
            <auto_delta>-1</auto_delta>
            <frame-number>1830920</frame-number>
            <nb_frames>4294967295</nb_frames>
            <frames-left>4293136376</frames-left>
            <foreground>
               <producer>
                  <type>ffmpeg-producer</type>
                  <filename>media\AMB.mp4</filename>
                  <width>720</width>
                  <height>576</height>
                  <progressive>true</progressive>
                  <fps>25</fps>
                  <loop>true</loop>
                  <frame-number>1830920</frame-number>
                  <nb-frames>4294967295</nb-frames>
                  <file-frame-number>520</file-frame-number>
                  <file-nb-frames>1600</file-nb-frames>
               </producer>
            </foreground>
            <background>
               <producer>
                  <type>empty-producer</type>
               </producer>
            </background>
            <index>1</index>
         </layer>
         <layer>
            <status>playing</status>
            <auto_delta>-1</auto_delta>
            <frame-number>1830758</frame-number>
            <nb_frames>4294967295</nb_frames>
            <frames-left>4293136538</frames-left>
            <foreground>
               <producer>
                  <type>separated-producer</type>
                  <fill>
                     <producer>
                        <type>ffmpeg-producer</type>
                        <filename>media\action.mpg</filename>
                        <width>1920</width>
                        <height>1080</height>
                        <progressive>false</progressive>
                        <fps>25</fps>
                        <loop>true</loop>
                        <frame-number>1830758</frame-number>
                        <nb-frames>4294967295</nb-frames>
                        <file-frame-number>22</file-frame-number>
                        <file-nb-frames>247</file-nb-frames>
                     </producer>
                  </fill>
                  <key>
                     <producer>
                        <type>ffmpeg-producer</type>
                        <filename>media\action_a.mpg</filename>
                        <width>1920</width>
                        <height>1080</height>
                        <progressive>false</progressive>
                        <fps>25</fps>
                        <loop>true</loop>
                        <frame-number>1830758</frame-number>
                        <nb-frames>4294967295</nb-frames>
                        <file-frame-number>22</file-frame-number>
                        <file-nb-frames>247</file-nb-frames>
                     </producer>
                  </key>
               </producer>
            </foreground>
            <background>
               <producer>
                  <type>empty-producer</type>
               </producer>
            </background>
            <index>2</index>
         </layer>
      </layers>
   </stage>
   <mixer/>
   <output>
      <consumers>
         <consumer>
            <type>oal-consumer</type>
            <index>500</index>
         </consumer>
         <consumer>
            <type>ogl-consumer</type>
            <key-only>false</key-only>
            <windowed>true</windowed>
            <auto-deinterlace>true</auto-deinterlace>
            <index>600</index>
         </consumer>
      </consumers>
   </output>
   <index>0</index>
</channel>
4

2 に答える 2

0
import xml.etree.ElementTree as ET                                              
tree = ET.parse('x.xml')                                                        
root = tree.getroot()                                                           

for child in root:                                                              
    print child.tag                                                             
    for child2 in child:                                                        
        print '> ',child2.tag                                                   

'''                                                                             
====                                                                            
output                                                                          
====                                                                            
video-mode                                                                      
stage                                                                           
>  layers                                                                       
mixer                                                                           
output                                                                          
>  consumers                                                                    
index                                                                           

'''   

「中身によって構造が違う」という問題点について。すべての XML は、DTD という定義に関して定義されています。ファイルの構造は内部で変更できません。そうしないと、不明確になります。つまり、ノードの上のリーフに応じてツリーの一部を解析したい場合は、次のような if then else ステートメントと関数を考え出す必要があります。

import xml.etree.ElementTree as ET                                              
tree = ET.parse('x.xml')                                                        
root = tree.getroot()                                                           

def parseStageTag(element):                                                     
    print 'parsing Stage'                                                       
    for child in element:                                                       
        if child.tag=='layers':                                                 
            parseLayersTag(child)                                               

def parseOutputTag(element):                                                    
    pass                                                                        

def parseLayersTag(element):                                                    
    print 'parsing Layers'                                                      
    for child in element:                                                       
        print child                                                             


for child in root:                                                              
    if child.tag=='stage':                                                      
        parseStageTag(child)                                                    

    for child2 in child:                                                        
        print '> ',child2.tag  
'''
output
parsing Stage
parsing Layers
<Element 'layer' at 0x1079e4250>
<Element 'layer' at 0x1079e4f10>
<Element 'layer' at 0x1079e6510>
>  layers
>  consumers
'''
于 2012-11-14T10:07:41.540 に答える