アクセスXMLNS属性をPython Elementree?
-
21-09-2019 - |
質問
できるように、きNSアクセス属性を使用ElementTree?
以下の:
<data xmlns="http://www.foo.net/a" xmlns:a="http://www.foo.net/a" book="1" category="ABS" date="2009-12-22">
しよう。get('xmlns')を取得しま裏なしカテゴリーの日晴れのお役に立てるよう評価..
正しい解決策はありません
他のヒント
と思い element.tag
えます。お客様の例では欠末尾にスラッシュではアンバランスな解析.いくらいが丁度いいのです。
>>> from xml.etree import ElementTree as ET
>>> data = '''<data xmlns="http://www.foo.net/a"
... xmlns:a="http://www.foo.net/a"
... book="1" category="ABS" date="2009-12-22"/>'''
>>> element = ET.fromstring(data)
>>> element
<Element {http://www.foo.net/a}data at 1013b74d0>
>>> element.tag
'{http://www.foo.net/a}data'
>>> element.attrib
{'category': 'ABS', 'date': '2009-12-22', 'book': '1'}
またお知りになxmlns URI分割することができすような関数:
def tag_uri_and_name(elem):
if elem.tag[0] == "{":
uri, ignore, tag = elem.tag[1:].partition("}")
else:
uri = None
tag = elem.tag
return uri, tag
たい名前空間は、修飾名をElementTree、 effbotの例.
Effbot NameSpacesのドキュメント/例を見てください。具体的には parse_map 関数。その特定の要素に適用されるプレフィックス/URIマッピングを含む各要素に * ns_map *属性を追加する方法を示します。
ただし、すべての要素にNS_MAP属性を追加します。私のニーズのために、私は要素を簡単に検索し、ハードコーディングではないようにするために使用されるすべての名前空間のグローバルマップが必要だとわかりました。
これが私が思いついたものです:
import elementtree.ElementTree as ET
def parse_and_get_ns(file):
events = "start", "start-ns"
root = None
ns = {}
for event, elem in ET.iterparse(file, events):
if event == "start-ns":
if elem[0] in ns and ns[elem[0]] != elem[1]:
# NOTE: It is perfectly valid to have the same prefix refer
# to different URI namespaces in different parts of the
# document. This exception serves as a reminder that this
# solution is not robust. Use at your own peril.
raise KeyError("Duplicate prefix with different URI found.")
ns[elem[0]] = "{%s}" % elem[1]
elif event == "start":
if root is None:
root = elem
return ET.ElementTree(root), ns
これを使用すると、XMLファイルを解析し、名前空間マッピングでDICTを取得できます。したがって、次のようなXMLファイルがある場合(「my.xml」):
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"\
>
<feed>
<item>
<title>Foo</title>
<dc:creator>Joe McGroin</dc:creator>
<description>etc...</description>
</item>
</feed>
</rss>
XMLネームペイスを使用して、次のような要素の情報を取得できます DC:作成者:
>>> tree, ns = parse_and_get_ns("my.xml")
>>> ns
{u'content': '{http://purl.org/rss/1.0/modules/content/}',
u'dc': '{http://purl.org/dc/elements/1.1/}'}
>>> item = tree.find("/feed/item")
>>> item.findtext(ns['dc']+"creator")
'Joe McGroin'
これを試して:
import xml.etree.ElementTree as ET
import re
import sys
with open(sys.argv[1]) as f:
root = ET.fromstring(f.read())
xmlns = ''
m = re.search('{.*}', root.tag)
if m:
xmlns = m.group(0)
print(root.find(xmlns + 'the_tag_you_want').text)
所属していません StackOverflow