2016-07-07 40 views
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)

我怎样组织这一切,如果我不想每次我调用函数时都必须传递一个名称空间参数?

回答

0

你可以做的是“部分应用功能”。

def build_value_getter(namespace): 
    def func(some_lxml_object, 'some xpath query', ns=namespace) 
     return get_value(some_lxml_object, 'some xpath query', ns=ns) 
    return func 

my_get_value = build_value_getter(self.ns) 
my_get_value(some_lxml_object, 'some xpath query') # Uses self.ns implicitly 
相关问题