3

これはlxml docの例です:

>>> regexpNS = "http://exslt.org/regular-expressions"
>>> find = etree.XPath("//*[re:test(., '^abc$', 'i')]",
...                    namespaces={'re':regexpNS})

>>> root = etree.XML("<root><a>aB</a><b>aBc</b></root>")
>>> print(find(root)[0].text)
aBc

関数をデフォルトの名前空間にインポートre:test()して、 prefix なしで呼び出すことができるようにしますre:。どうすればいいですか?ありがとう!

4

1 に答える 1

5

空の関数名前空間に関数を配置できます。

functionNS = etree.FunctionNamespace(None)
functionNS['test'] = lambda context, nodes, *args: print(context, nodes, args)

そうすることで、新しいtest関数はすでに空の名前空間プレフィックスで登録されています。つまり、次のように使用できます。

root.xpath("//*[test(., 'arg1', 'arg2')]")

残念ながら、呼び出された関数"{http://exslt.org/regular-expressions}test"は python からは利用できず、C で実装された lxml 拡張内からのみ利用できるため、単純に に割り当てることはできませんfunctionNS['test']

つまり、空の関数名前空間に割り当てるには、Python で再実装する必要があります...

3 文字を入力する手間を惜しまない場合は、このトリックを使用してre、名前空間のプレフィックスをグローバルにすることができます。

etree.FunctionNamespace("http://exslt.org/regular-expressions").prefix = 're'

そうすれば、少なくとも xpath 式ごとに名前空間の dict を渡す必要はありません。

于 2013-06-25T09:33:06.770 に答える