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

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

新規登録して質問してみよう
ただいま回答率
85.35%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

633閲覧

pythonでxmlファイル操作

takugon92

総合スコア20

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/27 15:17

pythonでxmlファイルを操作しています.
具体的にしたいことは,下記xmlファイルの6行目,<target path="C:\USERS--->の部分のpathを変更したいです.

xml

1<?xml version="1.0" encoding="utf-8"?> 2<profiles xmlns="http://www.logitech.com/Cassandra/2010.7/Profile"> 3 <profile gameid="" gkeysdk="0" name="fusion360" gpasupported="0" guid="{F68B6391-AFCC-4C5F-9F45-C57142EB2538}" lastplayeddate="2021-05-07T13:02:16" launchable="1" lock="0"> 4 <icon>89504e470d0a1a0a0000000d49484452000000300000003008060000005702f9870000000970485973000016250000162501495224f00</icon> 5 <description></description> 6 <target path="C:\USERS\---\APPDATA\LOCAL\AUTODESK\WEBDEPLOY\PRODUCTION\2A0E6841A65BD64CA8392D2C15739F5B191739B9\FUSION360.EXE"/> 7 <target path="C:\USERS\---\APPDATA\LOCAL\AUTODESK\WEBDEPLOY\PRODUCTION\5873EDB3CE0A7CE93D3EE911F7BA68D35A7E5862\FUSION360.EXE"/> 8 <target path="C:\USERS\---\APPDATA\LOCAL\AUTODESK\WEBDEPLOY\PRODUCTION\6A0C9611291D45BB9226980209917C3D\FUSIONLAUNCHER.EXE"/>

単純に

python

1xml_path = r'xmlファイルパス' 2tree = ET.parse(xml_path) 3root = tree.getroot() 4 5for target in tree.iter('target'): 6 print(target.text)

で取得できると思ったのですが,tree.iter('target')がないため,for文に入らずプログラムが終了してしまいます.
pathの変更は自分で作ってみますが,要素の取得ができないためそれ以降のプログラムが作れません.

どのようにしたら良いでしょうか?ご教授お願いします.

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

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

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

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

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

guest

回答1

0

ベストアンサー

概要

Pythonのeml.etreeは名前空間を厳密に見て処理を進めていきます。※Pythonの公式ドキュメント
そのため、xmlnsなどでソースに名前空間を使っている場合は、この情報まで正確に指定する必要があります。

動作例

※もともとのコードに最小限の労力で対応するケース

python

1xml_path = r'xmlファイルパス' 2tree = ET.parse(xml_path) 3root = tree.getroot() 4 5# {名前空間}要素名 の形式で指定する 6for target in tree.iter('{http://www.logitech.com/Cassandra/2010.7/Profile}target'): 7 print(target.text)

別例

※今後、名前空間の指定が煩雑になってくるときに有効かもしれない方法

python

1# 名前空間のマッピングを予め用意する 2ns = { 3 "profile": "http://www.logitech.com/Cassandra/2010.7/Profile", 4} 5 6# iterでなくfindallを使い、nsを利用して短縮表記する 7# (profile:の部分をnsに対応する名前空間に置き換える) 8for target in tree.findall(".//profile:target", ns): 9 print(target)

投稿2021/05/27 15:43

attakei

総合スコア2740

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

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

takugon92

2021/05/27 15:53

attakeiさん,迅速な回答ありがとうございます. 別例も今後の知識としてためておきます. 今変更したら,取得することができました.(.textではNoneになってしまいましたので,.attribに変更しました)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問