0
我正在处理一些共享自定义名称空间的XML文档。我有各种各样的具有相同名称空间的文件,并试图找出解析时处理名称空间的最佳/最优雅的方式。下面是一个示例:在lxml解析函数中处理全局名称空间
在特定脚本的开头,我读取了一个XML文件,使用etree.parse()
解析它,检查第一个或两个标记来标识命名空间,然后将它们保存在某处。我可以把它们放在全球范围内,但现在它们被储存在班级self.ns
。
我有这个函数,我写了从给定的xpath查询返回值。它看起来像这样:
# noinspection PyBroadException
def get_value(self, lxml_object, xpath_query=None, return_int=False):
"""
BE CAREFUL using this function because it will catch all xpath query exceptions
:param lxml_object: an lxml.etree object
:param xpath_query: a valid xpath query
:param return_int: set to True if you want an int rather than a string
:return: the value of the field corresponding to the xpath query
"""
if return_int is True:
if xpath_query:
try:
return int(lxml_object.xpath(xpath_query, namespaces=self.ns)[0].text)
except:
return None
else:
try:
return int(lxml_object[0].text)
except:
return None
else:
if xpath_query:
try:
return lxml_object.xpath(xpath_query, namespaces=self.ns)[0].text
except:
return None
else:
try:
return lxml_object[0].text
except:
return None
这是好的,当我把它放在我的类中并调用self.get_value()
因为self.ns
已定义。
我在很多不同的脚本中使用这个函数,并希望把它放在一个单独的文件中解析实用程序,我可以从中导入它。然而,这引起了添加命名空间参数,并为每一个我用它的时候的命名空间传递给函数的幽灵,像
return get_value(some_lxml_object, 'some xpath query', ns=self.ns)
我怎样组织这一切,如果我不想每次我调用函数时都必须传递一个名称空间参数?