35 lines
1.3 KiB
Python
35 lines
1.3 KiB
Python
from xml.etree.ElementTree import parse
|
||
|
||
class XMLNameSpace:
|
||
def __init__(self, **kwargs):
|
||
self.namespaces = {}
|
||
for name, url in kwargs.items():
|
||
self.register(name, url)
|
||
|
||
def register(self, name, url):
|
||
self.namespaces[name] = '{'+url+'}'
|
||
|
||
def __call__(self, path):
|
||
return path.format_map(self.namespaces)
|
||
|
||
if __name__ == '__main__':
|
||
# 如果是一个有命名空间的XML文件,那么很明显传统的读取方法会变得繁琐
|
||
doc = parse('6.数据编码与处理/7.exp.xml')
|
||
print(doc.findtext('author'))
|
||
print(doc.find('content'))
|
||
|
||
# 由于html不在全局命名空间下,所以找不到这个东西
|
||
print(doc.find('content/html'))
|
||
|
||
# 在指定了命名空间的所有层级下,都要使用{}来标识命名空间
|
||
print(doc.find('content/{http://www.w3.org/1999/xhtml}html'))
|
||
# 记住,我说的是,所有层级
|
||
# 不起效
|
||
print(doc.find('content/{http://www.w3.org/1999/xhtml}html/head'))
|
||
# 正常生效
|
||
print(doc.find('content/{http://www.w3.org/1999/xhtml}html/{http://www.w3.org/1999/xhtml}head'))
|
||
|
||
# 这样就很甜蜜曹丹,好麻烦,而且还要手动输入命名空间,不如写个类让它自己解析了
|
||
ns = XMLNameSpace(html="http://www.w3.org/1999/xhtml")
|
||
print(doc.find(ns('content/{html}html')))
|