2016-07-07 5 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)

のように、それに名前空間の引数を追加し、機能に、私はそれを使用するたびに名前空間を渡すことの亡霊を上げます私は関数を呼び出すたびにnamespace引数を渡さなければならないのですか?

答えて

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 
関連する問題