xmlpython命名空间
❶ python命名空间是什么
在Python中,所有的名字都存在一个空间中,它们在该空间中存在和被操作——这就是命名空间。它就像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面找到相应的对象。
【定义】
名称到对象的映射。命名空间是一个字典的实现,键为变量名,值是变量对应的值。各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响。
相关推荐:《Python教程》
【分类】
python程序执行期间会有2个或3个活动的命名空间(函数调用时有3个,函数调用结束后2个)。按照变量定义的位置,可以划分为以下3类:
Local,局部命名空间,每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。
Global,全局命名空间,每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。
Built-in,python自带的内建命名空间,任何模块均可以访问,放着内置的函数和异常。
【生命周期】
Local(局部命名空间)在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。
Global(全局命名空间)在模块被加载时创建,通常一直保留直到python解释器退出。
Built-in(内建命名空间)在python解释器启动时创建,一直保留直到解释器退出。
各命名空间创建顺序:python解释器启动 ->创建内建命名空间 -> 加载模块 -> 创建全局命名空间 ->函数被调用 ->创建局部命名空间
各命名空间销毁顺序:函数调用结束 -> 销毁函数对应的局部命名空间 -> python虚拟机(解释器)退出 ->销毁全局命名空间 ->销毁内建命名空间
python解释器加载阶段会创建出内建命名空间、模块的全局命名空间,局部命名空间是在运行阶段函数被调用时动态创建出来的,函数调用结束动态的销毁的。
❷ 怎么用python获取一段带有命名空间的xml
截取从<soap:Body>的index到</soap:Body>的index的字符串就OK了
❸ 如何用python解析带有命名空间的xml文件
大概一般人也不会在程序里去直接修改名字空间里的内容 举个栗子 >>> globals(){'__builtins__': , '__name__': '__main__', '__doc__': None, '__package__': None}>>> globals()['name'] = 'bigbang'>>> globals(){'__builtins__': ,
❹ python怎么处理xml节点包含命名空间,也就是冒号的情况
a:b为名不行吧,要展开为{URI}b这种形式,看看下面小例子取出的tag名称:
# -*- coding: utf-8 -*-
from xml.etree import ElementTree as ET
import cStringIO
xml = """\
<?xml version="1.0"?>
<root xmlns = "http://default-namespace.org/"
xmlns:py = "http://www.python.org/ns/">
<py:elem1 />
<elem2 xmlns="" />
</root>
"""
f = cStringIO.StringIO(xml)
#find all elements and print tag's name.
tree = ET.parse(f)
print repr(tree.getroot().tag)
elems = tree.findall('.//*')
for elem in elems:
print repr(elem.tag)
#same as above, but using iterparse.
f.seek(0)
for event, elem in ET.iterparse(f, ("start",)):
print repr(elem.tag)
输出:
'{http://default-namespace.org/}root'
'{http://www.python.org/ns/}elem1'
'elem2'
'{http://default-namespace.org/}root'
'{http://www.python.org/ns/}elem1'
'elem2'
❺ Python语言中命名空间的使用
如果一个命名声明为全局的,那么对它的所有引用和赋值会直接搜索包含这个模块全局命名的作用域。如果要重新绑定最里层作用域之外的变量,可以使用 nonlocal 语句;如果不声明为 nonlocal,这些变量将是只读的(对这样的变量赋值会在最里面的作用域创建一个新的局部变量,外部具有相同命名的那个变量不会改变)。
通常,局部作用域引用当前函数的命名。在函数之外,局部作用域与全局使用域引用同一命名空间:模块命名空间。类定义也是局部作用域中的另一个命名空间。
重要的是作用域决定于源程序的意义:一个定义于某模块中的函数的全局作用域是该模块的命名空间,而不是该函数的别名被定义或调用的位置,了解这一点非常重要。另一方面,命名的实际搜索过程是动态的,在运行时确定的——然而,Python 语言也在不断发展,以后有可能会成为静态的“编译”时确定,所以不要依赖动态解析!(事实上,局部变量已经是静态确定了。)
Python 的一个特别之处在于:如果没有使用 global 语法,其赋值操作总是在最里层的作用域。赋值不会复制数据,只是将命名绑定到对象。删除也是如此:del x 只是从局部作用域的命名空间中删除命名 x 。事实上,所有引入新命名的操作都作用于局部作用域。特别是 import 语句和函数定义将模块名或函数绑定于局部作用域(可以使用 global 语句将变量引入到全局作用域)。
global 语句用以指明某个特定的变量为全局作用域,并重新绑定它。nonlocal 语句用以指明某个特定的变量为封闭作用域,并重新绑定它。
❻ python中怎样查看已加载的命名空间中所有变量和函数
globals()和locals()函数的返回值是一个字典,包含命名空间的所有变量名和对应的值(比如字符串、字典、列表、函数、模块),globals()是全局命名空间,locals()是局部命名空间,全局指这个模块,局部可以是函数、类、闭包。调用dir()函数传参或者不传,它的返回值就是这俩函数返回值的键组成的列表。
❼ Python lxml所有与多个命名空间问题,怎么解决
有如下xml
<A xmlns="http://This/is/a/namespace">
<B>dataB1</B>
<B>dataB2</B>
<B>
<C>dataC</C>
</B>
</A>
其中的xmlns属性表示的是该xml的默认命名空间,该命名空间必须是一个url形式
查看xml的tag
#encoding=utf8
from lxml import etree
str_xml = """
<A xmlns="http://This/is/a/namespace">
<B>dataB1</B>
<B>dataB2</B>
<B>
<C>dataC</C>
</B>
</A>
"""
xml = etree.fromstring(str_xml)
for node in xml.iter():
print node.tag
结果为:
{http://This/is/a/namespace}A
{http://This/is/a/namespace}B
{http://This/is/a/namespace}B
{http://This/is/a/namespace}B
{http://This/is/a/namespace}C
可以看到,跟普通xml的tag相比每个tag前面都多出了一个命名空间
获取命名空间 .nsmap
from lxml import etree
str_xml = """
<A xmlns="http://This/is/a/namespace">
<B>dataB1</B>
<B>dataB2</B>
<B>
<C>dataC</C>
</B>
</A>
"""
xml = etree.fromstring(str_xml)
ns = xml.nsmap
print ns
print ns[None]
结果
{None: 'http://This/is/a/namespace'}
http://This/is/a/namespace
ns[None]获取的是默认命名空间,ns会显示所有的命名空间
获取有命名空间的节点内容
from lxml import etree
str_xml = """
<A xmlns="http://This/is/a/namespace">
<B>dataB1</B>
<B>dataB2</B>
<B>
<C>dataC</C>
</B>
</A>
"""
xml = etree.fromstring(str_xml)
ns = xml.nsmap[None]
ns = "{%s}" % ns
for item in xml.findall("{0}B/{0}C".format(ns)): #不能用xpath会出错
print item.text
结果
dataC
注意,在查找节点时,每一级节点都需要加上命名空间。而且测试时发现,findall可以正常查找到信息,而xpath会报错。
获取带命名空间节点的属性值
from lxml import etree
str_xml = """
<A xmlns="http://This/is/a/namespace">
<B b="123">dataB1</B>
<B>dataB2</B>
<B>
<C>dataC</C>
</B>
</A>
"""
xml = etree.fromstring(str_xml)
ns = xml.nsmap[None]
ns = "{%s}" % ns
item = xml.find(ns+"B")
print item.get("b")
print item.text
结果
123
dataB1
可以看到,获取属性时,不需要加命名空间,直接获取即可
❽ Python中的命名空间是什么
编程语言中的命名空间简单来说就是一些词的集合,
同一个词在不同的命名空间会有不同的意思,
用一个词来做例子
“手纸”在中文这个命名空间是厕纸的意思,
而在日文这个命名空间是信的意思。
这个算是过分简化的说明了。
❾ python处理是Xml文件的,删除标签属性符合条件的!如<data name="test"id="
你可以使用 BeautifulSoup 套件:
安装:
pip install bs4
如果觉得 html 解析器不敷使用,参考文档安装其他适合的解析器。
如果想要详细了解 BeautifulSoup 也请参考官方文档(有中文版本)。
测试档:
以下是我使用的测试文件:
# delete.txt
126
147
# test.xml
<re>
<id>123</id>
<name>abc</name>
</re>
<re>
<id>126</id>
<name>abc</name>
</re>
<re>
<id>135</id>
<name>abc</name>
</re>
<re>
<id>147</id>
<name>abc</name>
</re>
代码:
from bs4 import BeautifulSoup
with open('test.xml') as reader:
xml = reader.read()
deleted_id = []
with open('delete.txt') as reader:
for line in reader:
line = line.strip()
deleted_id.append(line)
def has_delete_id(tag):
return tag.name=='re' and tag.id.string in deleted_id
soup = BeautifulSoup(xml, 'html.parser')
tags = soup(has_delete_id)
for tag in tags:
tag.decompose()
print(soup.prettify())
程式输出:
<re>
<id>
123
</id>
<name>
abc
</name>
</re>
<re>
<id>
135
</id>
<name>
abc
</name>
</re>
代码说明:
首先我们从 Beautiful Soup 的套件中汇入 BeautifulSoup 类
from bs4 import BeautifulSoup
接着分别从 delete.txt 和 test.xml 中读出要删除的 id 和主要的 xml 内容,下一步是实体化生成一个 BeautifulSoup对象 soup, 我们采用 html.parser 解析器去解析 xml:
soup = BeautifulSoup(xml, 'html.parser')
在此我们定义了一个用于过滤的 function has_delete_id,每一个在 xml 中的tag 只要是 <re> tag 且含有想要删除的 <id> tag 就会被检索出来:
def has_delete_id(tag):
return tag.name=='re' and tag.id.string in deleted_id
接着 soup(has_delete_id) 会帮助我们找到欲删除的 tag,接着走访搜索出来的这些 tag 并呼叫方法 decompose() 来从文件中删除该标签。
最后 soup.prettify()可以帮助我们输出修改后的文件。