質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

2回答

3251閲覧

pythonでXMLヘッダを編集したい

katosei

総合スコア32

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/10/04 14:17

やりたい事

pythonでXMLヘッダを編集したい

やった事

python3

1#!/bin/env python3.6 2from xml.etree import ElementTree 3from xml.dom import minidom 4 5def createXML(): 6 ## object化 7 baseXML='<?xml version="1.0" encoding="UTF-8" ?> <Req></Req>' 8 root = ElementTree.fromstring(baseXML) 9 10 ## textへ戻す 11 rough_string = ElementTree.tostring(root, 'utf-8') 12 reparsed = minidom.parseString(rough_string) 13 print(reparsed.toprettyxml(indent=" ")) 14 15createXML()

結果

$ ./test.py <?xml version="1.0" ?> <Req/>

出したかったもの

$ ./test.py <?xml version="1.0" encoding="UTF-8"?> <Req></Req>

encoding="UTF-8" の文言が消えてしまいました。

確認した所消えたのは

reparsed = minidom.parseString(rough_string)

print(reparsed.toprettyxml(indent=" "))

のいずれかのようでです。
https://docs.python.jp/3/library/xml.dom.minidom.html
にもXMLヘッダに関する記載があるのですが、試してもうまく編集出来ませんでした。

なお一度ファイルに吐かせる等の処理はしてないです。
ドキュメントにある、writerを利用する意味がよくわかりませんでした。

おまけ

<Req></Req><Req/>が等価なのは知っているのですが
この辺を好きな方を出せるよう制御する方法がもしあるなら、
ついでに教えてくれると大変助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

下記2つは xml.etree.ElementTree.ElementTree.write で実現できることがわかったので、少し遠回りなやり方になりますが、以下のようにできました。

  • 空タグの出力形式の制御
  • XML 宣言に encoding 形式も付与

python

1import xml.etree.ElementTree as ET 2from io import BytesIO 3 4xml = '<?xml version="1.0" encoding="UTF-8" ?> <Req></Req>' 5 6root = ET.fromstring(xml) 7tree = ElementTree(root) 8 9fstream = BytesIO() 10string = tree.write( 11 fstream, 12 encoding="utf-8", # エンコーディングを指定 13 short_empty_elements=False, # 空タグの省略無効 14 xml_declaration=True) # XML宣言を出力する。 15string = fstream.getvalue().decode('utf-8') # BytesIO -> bytes -> str 16 17print(string)

output

1<?xml version='1.0' encoding='utf-8'?> 2<Req></Req>

投稿2018/10/04 15:14

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

minidom通すと2つ目の要求は無理そうですね。

python

1rough_string = ElementTree.tostring(root, 'utf-8', short_empty_elements=False) 2reparsed = minidom.parseString(rough_string) 3print(reparsed.toprettyxml(indent=" ", encoding='UTF-8').decode('utf-8'))

投稿2018/10/04 15:07

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問