Xpath查询'喜欢'替换

时间:2011-09-05 22:55:14

标签: python xpath

好的,所以我有一些看起来像这样的xml示例:

<Node name="details">
   <Node name="1130482269">
      <Val name="type"><u>2</u></Val>
      <Val name="owner"><n/></Val>
      <Val name="account_number"><u>99-71-39</u></Val>
   </Node>
   <Node name="570722270">
      <Val name="type"><u>2</u></Val>
      <Val name="owner"><n/></Val>
      <Val name="account_number"><u>99 71 40</u></Val>
   </Node>
   <Node name="1845243341">
      <Val name="type"><u>2</u></Val>
      <Val name="owner"><n/></Val>
      <Val name="account_number"><u>9971-41</u></Val>
   </Node>
</Node>

我正在尝试基于account_number进行搜索。但它有许多不同的格式。有些有空格,有些有破折号,有些有混合等。如果我能够搜索删除空格和短划线,我应该能够得到任何帐号。

使用accountnumber作为搜索查询,最终目标是通过在XPATH中执行搜索来获取第二级节点名称编号:

doc = libxml2.parseDoc(xml)
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("/Node/Node[Val[@name='account_number']/*='" + str(accountnumber) + "']/@name")

有没有办法使用XPATH搜索,删除所有破折号和空格,只留下数字?

由于

2 个答案:

答案 0 :(得分:2)

是的,可以使用translate()功能。例如:

"translate(Node/Node[@name='1130482269']/Val[@name='account_number'],'- ','')"

将输出997139

您可以使用then(为便于阅读而破坏代码行):

"translate(
  /Node/Node[@name='" + 
  str(accountnumber) + 
  "']/Val[@name='account_number'],'- ','')"

请注意删除空格所需的翻译'- '(或甚至'-&#x20;')的第二个参数中包含的空格。

答案 1 :(得分:0)

不幸的是,libxml2环境仅支持XPath 1.0,因此您无法访问XPath 2.0的正则表达式功能,例如matches()函数。但它确实支持添加您自己的扩展功能(请参阅http://xmlsoft.org/XSLT/extensions.html),以便您可以考虑自己这样做。