2016-05-25 11 views
0

私はpythonとxmlの構文解析を行うnewbですので、私は20時間以上の長い時間をかけてフォーラムを見つけ、 m後。私が見たスレッドのほとんどは私の問題のための解決策を持っていましたが、それらは日付がついていて、Pythonのバージョンが違うので使用できません。彼らは私が試してみるとうまくいかなかった。私が何をしたいかPython 3.5 minidom経由でxmlを書くことができません

  • が解析XMLに
  • を、その内容を変更し、特定の条件に基づいて、新しいXMLのフォーマットとして、これらの変更で全体のxmlアウト
  • リライトは
を保持しました

私が使っていること:

  • のpython 3.5
  • minidomとのTkinterモジュール

ここでは、新しいXMLを書き込むしようとしたとき、私は取得していますエラーです:

this_xml.write(OFILE)
はAttributeError: '文書'オブジェクトには「書き込み」属性がありません

私はElementTreeとlxmlを試しましたが、私はminidomで最も進歩しました。私はそこに私はここでやっている愚かな呼び出しのだトンと確信している

import tkinter 
from tkinter import * 
from tkinter import messagebox 
from tkinter import filedialog 
from xml.dom.minidom import parse 
import xml 
import os 
import xml.dom.minidom 

root = Tk() 
root.withdraw() 
file_path = filedialog.askopenfilename(filetypes=[("XML",".xml")]) 
filename, file_extension = os.path.splitext(os.path.basename(file_path)) 

if file_extension ==".xml": 
    OutputFileName = filename[:-2] + "VS_" + filename[-2:] + "_NEW" + file_extension 
    this_xml = xml.dom.minidom.parse(file_path) 
    xml_contents = this_xml.documentElement 

    #do stuff 

    ofile = open(OutputFileName, 'wb') 
    this_xml.write(ofile) 
    #xml_contents.write(ofile) 

:ここ

は(私が思う)適切なコードです。 #doの部分では、特定のノードデータを読み込み、変更して結果を出力しています。印刷物は見栄えが良いですが、今はそのような変更を形にすることができません。

私はpython 2.7(これまでのチュートリアル/チュートリアル/例のほとんどがベースになっています)に戻す前に、私は何か助けに感謝します。

+0

第1に、Python 3と一緒にPython 2をインストールすることができます。したがって、Python 2用の例が書かれていれば、Python 2でそれらを試してはいけないという言い訳はありません。 -トピック。あなたは、あなたが知っているはずの最小限の例を抽出した後で、「ここ(私は思う)は...だ」と書いてはいけません。誰でも気にしてコードを取り出して再現できるはずです。 –

答えて

0

this_xmlDocumentで、Documentのオブジェクトにwrite()メソッドがないため、このエラーが発生しています。 documentationをご覧ください。 xml.dom.minidom.parse()は、NodeのサブクラスであるDocumentを返します。 hereのいずれかの方法を使用して、XMLをファイルに書き込むことができます。toxml()またはtoprettyxml()のいずれかを使用してDocumentをファイルに書き込むことができる文字列に変換するか、またはwritexml()を直接書き込んでください。

with open("myfile.xml", "w") as xml_file: 
    this_xml.writexml(xml_file) 

通常の変数には大文字のキャメルケース名をOutputFileNameのように使用しないでください。その名前形式はクラス名用に予約されています。この変数名をPythonで書く慣用方法は、output_file_nameです。

+0

非常に詳細な回答をいただきありがとうございます、ベン!私はすべてのcamelcased名前を修正し、それらを避ける習慣になるだろう。 "myfile.xml"をoutput_file_nameに置き換えてコードをコピーして貼り付けてもエラーは発生しません。しかし、私はファイルを見つけることができません(ドライブ全体を検索して、output_file_nameという文字列を検索しましたが、print_file_nameを実行して検索しました)。 toprettyxmlを使用してフォーマットを修正したいのですが、 xmlがどのように出力されているかを確認したい。新しいスレッドを開くべきですか?結局のところ、エラーは本当にあなたのおかげで修正されています!興味深い。 – kusogaki

+0

私はこれを代わりにして、xmlはすてきなように見えました。 full_file_path = filedialog.askopenfilename(ファイルタイプ= [( "XML"、 "。xml")]) file_path = os.path.dirname(full_file_path)+ "// xml_fileとしてopen(output_file_name、 "w"): this_xml.writexml(xml_file) 私はexpatエラーを取得していたので、それは良いことです、それをprettyprintする必要はなかったし、それは完璧に見える。 – kusogaki

+0

お手伝いします!あなたのコードは絶対パス( '/ bar/baz/foo.xml'ではなく' foo.xml')ではなく、出力ファイルの相対パスを作成するので、ファイルはあなたの現在の作業ディレクトリ、あなたがプログラムを実行したディレクトリ。 – Ben

関連する問題