将 Google 的 libphonenumber 与 BaseX 结合使用

Use Google's libphonenumber with BaseX

我正在使用 BaseX 9.2 抓取在线 phone 目录。没有什么违法的,它属于非营利组织,我的老板是其中的成员,所以我可以访问它。我想要的是将所有这些号码添加到我的个人 phone 簿中,这样我就可以知道谁在给我打电话(主要是为了联系我的老板)。数据状况非常糟糕,尤其是数字(大约一千个数字,来自世界各地)。有些是E164,有些不是,有些是彻头彻尾的无效号码。

我最初使用 OpenRefine 3.0 to cleanup the data. It also plays very nicely with Google's libphonenumber 来鞭打数字的形状。它就像从 Maven 下载 JAR 文件一样简单,将它放在 OpenRefine 的 lib 目录中,然后在每个 phone number (numberStr):

上像这样调用 Jython
from com.google.i18n.phonenumbers import PhoneNumberUtil
from com.google.i18n.phonenumbers.PhoneNumberUtil import PhoneNumberFormat
pu = PhoneNumberUtil.getInstance()
numberStr = str(int(value))
number = pu.parse('+' + numberStr, 'ZZ')
try: country = pu.getRegionCodeForNumber(number)
except: country = 'US'
number = pu.parse(numberStr, (country if pu.isValidNumberForRegion(number, country) else 'US'))
return pu.format(number, PhoneNumberFormat.E164)

我最近发现了 XPath 和 BaseX,发现它们与 HTML 一起非常简洁和强大。虽然我可以让 OpenRefine 直接吐出一个 VCF,但我找不到用 BaseX 插入 libphonenumber 的方法。由于两者都在 Java,我认为这将是直截了当的。

我尝试了他们的文档 (http://docs.basex.org/wiki/Java_Bindings),但 BaseX 没有发现开箱即用的 libphonenumber JAR。我尝试了各种路径、重命名和位置组合。我看到的唯一方法是编写包装器并将其放入 XQuery 模块 (XAR) 中并导入它。这将需要大量时间和 Java 编码技能,我绝对没有后者。

有没有简单的方法将 libphonenumber 与 BaseX 连接起来?或者一般来说,有没有办法使用 XPath link 外部 Java 库?我可以回到 OpenRefine,但恕我直言,它的工作流程非常笨拙。也没有办法要求网站管理员清理他的行为。或者,如果 OpenRefine 和 BaseX 不是这项工作的正确工具,还有其他清理数据的方法吗,尤其是 phone 数字?我需要每隔几个月执行一次此操作(用于网站上的更改和更新),如果我不能完全自动化,它会变得非常乏味。 至少需要一个基本的工作代码示例作为答案..(我直接在 Windows 10 x64 机器上使用独立的 BaseX JAR)

libphonenumber-8.10.16.jar 放在文件夹 ..basex/lib/custom 中以在类路径中获取它(参见 http://docs.basex.org/wiki/Startup#Full_Distributions)和 运行 bin/basexgui.bat

declare namespace Pnu="java:com.google.i18n.phonenumbers.PhoneNumberUtil";
declare namespace Pn="java:com.google.i18n.phonenumbers.Phonenumber$PhoneNumber";
let $pnu:=Pnu:getInstance()
let $pn:= Pnu:parse($pnu,"044 668 18 00","CH")
return Pn:getCountryCode($pn)

Returns 字符串“41”

没有从 XPath 调用 Java 的标准方法,但是许多基于 Java 的 XPath 实现提供了自定义方法来执行此操作。