Mel*_*ior 18 python xml elementtree
如何通过使用ElementTree访问NS属性?
具有以下内容:
<data xmlns="http://www.foo.net/a" xmlns:a="http://www.foo.net/a" book="1" category="ABS" date="2009-12-22">
Run Code Online (Sandbox Code Playgroud)
当我尝试root.get('xmlns')我回来没有,类别和日期都很好,任何帮助赞赏..
Jef*_*ris 15
我认为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'}
Run Code Online (Sandbox Code Playgroud)
如果您只想知道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
Run Code Online (Sandbox Code Playgroud)
有关ElementTree中名称空间和限定名称的更多信息,请参阅effbot的示例.
小智 8
查看effbot名称空间文档/示例; 特别是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
Run Code Online (Sandbox Code Playgroud)
使用此方法,您可以解析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>
Run Code Online (Sandbox Code Playgroud)
您将能够使用xml名称空间并获取dc:creator等元素的信息:
>>> 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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14429 次 |
| 最近记录: |