2016-11-16 15 views
0

外部テキストファイル(見つかった場合)を読み込み、その内容を新しく導入されたタグに挿入し、新しいXMLを保存するようにXMLファイルを解析しようとすると、ファイルを作成します。ファイルから新しいXMLタグにテキストを挿入する方法

コードは次のようになります。

try: 
    import xml.etree.cElementTree as ET 
except ImportError: 
    import xml.etree.ElementTree as ET 
import os 

# define our data file 
data_file = 'test2_of_2016-09-19.xml' 

tree = ET.ElementTree(file=data_file) 
root = tree.getroot() 

for element in root: 
    if element.find('File_directory') is not None: 
     directory = element.find('File_directory').text 
    if element.find('Introduction') is not None: 
     introduction = element.find('Introduction').text 
    if element.find('Directions') is not None: 
     directions = element.find('Directions').text 

for element in root: 
    if element.find('File_directory') is not None: 
     if element.find('Introduction') is not None: 
      intro_tree = directory+introduction 
      with open(intro_tree, 'r') as f: 
       intro_text = f.read() 
      f.closed 
      intro_body = ET.SubElement(element,'Introduction_Body') 
      intro_body.text = intro_text 
     if element.find('Directions') is not None: 
      directions_tree = directory+directions 
      with open(directions_tree, 'r') as f: 
       directions_text = f.read() 
      f.closed 
      directions_body = ET.SubElement(element,'Directions_Body') 
      directions_body.text = directions_text 

tree.write('new_' + data_file) 

問題がfile_directory、導入、および方向の最後見つけインスタンスが保存されているように、それが思われることであり、各として所望されていない複数のエントリに広がりますエントリーには話すための独自のレコードがあります。

ソースXMLファイルは、次のようになります

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Row> 
     <Entry_No>1</Entry_No> 
     <Waterfall_Name>Bridalveil Fall</Waterfall_Name> 
     <File_directory>./waterfall_writeups/1_Bridalveil_Fall/</File_directory> 
     <Introduction>introduction-bridalveil-fall.html</Introduction> 
     <Directions>directions-bridalveil-fall.html</Directions> 
    </Row> 
    <Row> 
     <Entry_No>52</Entry_No> 
     <Waterfall_Name>Switzer Falls</Waterfall_Name> 
     <File_directory>./waterfall_writeups/52_Switzer_Falls/</File_directory> 
     <Introduction>introduction-switzer-falls.html</Introduction> 
     <Directions>directions-switzer-falls.html</Directions> 
    </Row> 
</Root> 

所望の出力XMLは次のようになります。

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Row> 
     <Entry_No>1</Entry_No> 
     <Waterfall_Name>Bridalveil Fall</Waterfall_Name> 
     <File_directory>./waterfall_writeups/1_Bridalveil_Fall/</File_directory> 
     <Introduction>introduction-bridalveil-fall.html</Introduction> 
     <Directions>directions-bridalveil-fall.html</Directions> 
     <Introduction_Body>Text from ./waterfall_writeups/1_Bridalveil_Fall/introduction-bridalveil-fall.html</Introduction_Body> 
     <Directions_Body>Text from ./waterfall_writeups/1_Bridalveil_Fall/directions-bridalveil-fall.html</Directions_Body> 
    </Row> 
    <Row> 
     <Entry_No>52</Entry_No> 
     <Waterfall_Name>Switzer Falls</Waterfall_Name> 
     <File_directory>./waterfall_writeups/52_Switzer_Falls/</File_directory> 
     <Introduction>introduction-switzer-falls.html</Introduction> 
     <Directions>directions-switzer-falls.html</Directions> 
     <Introduction_Body>Text from ./waterfall_writeups/52_Switzer_Falls/introduction-switzer-falls.html</Introduction_Body> 
     <Directions_Body>Text from ./waterfall_writeups/52_Switzer_Falls/directions-switzer-falls.html</Directions_Body> 
    </Row> 
</Root> 

しかし、私はなってしまうことです。

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Row> 
     <Entry_No>1</Entry_No> 
     <Waterfall_Name>Bridalveil Fall</Waterfall_Name> 
     <File_directory>./waterfall_writeups/1_Bridalveil_Fall/</File_directory> 
     <Introduction>introduction-bridalveil-fall.html</Introduction> 
     <Directions>directions-bridalveil-fall.html</Directions> 
     <Introduction_Body>Text from ./waterfall_writeups/52_Switzer_Falls/introduction-switzer-falls.html</Introduction_Body> 
     <Directions_Body>Text from ./waterfall_writeups/52_Switzer_Falls/directions-switzer-falls.html</Directions_Body> 
    </Row> 
    <Row> 
     <Entry_No>52</Entry_No> 
     <Waterfall_Name>Switzer Falls</Waterfall_Name> 
     <File_directory>./waterfall_writeups/52_Switzer_Falls/</File_directory> 
     <Introduction>introduction-switzer-falls.html</Introduction> 
     <Directions>directions-switzer-falls.html</Directions> 
     <Introduction_Body>Text from ./waterfall_writeups/52_Switzer_Falls/introduction-switzer-falls.html</Introduction_Body> 
     <Directions_Body>Text from ./waterfall_writeups/52_Switzer_Falls/directions-switzer-falls.html</Directions_Body> 
    </Row> 
</Root> 

そもそも、bodyタグの内容をすべて1行に出力することなく、bodyタグの内容を紹介する方法はありますか(readab ility)?それぞれ

答えて

0

最初のごdirectoryに新しい値を割り当てるドキュメントの要素を超えるforループ反復処理し、introduction、およびdirections変数、各反復で、最後に発生要素の値で終わります。

辞書を作成して、タグ名をテキストコンテンツにマップし、そのマッピングを使用して新しいサブ要素をオンザフライで追加することです。例(参照ファイルを読まずに):

for row in root: 
    elements = {} 
    for node in row: 
     elements[node.tag] = node.text 

    directory = elements['File_directory'] 

    intro_tree = directory + elements['Introduction'] 
    intro_body = ET.SubElement(row, 'Introduction_Body') 
    intro_body.text = 'Text from %s' % intro_tree 

    directions_tree = directory + elements['Directions'] 
    directions_body = ET.SubElement(row, 'Directions_Body') 
    directions_body.text = 'Text from %s' % directions_tree 
+0

ありがとうございました。私が間違ったことを見つけ出し、ループの仕方を並べ替えることで解決しましたが、あなたが示唆したように辞書を作成することは理にかなっています。 – Johnny

関連する問題