2011-09-05 107 views
3

好了,所以我有一些示例XML,看起来像这样:Xpath查询“喜欢”替代

<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搜索的方式,去除所有破折号和空格,只留下数字?

感谢

+0

广东话你替换所有“”和”?将它们从您的文本中删除?林不熟悉Python,但据我所知是没有办法做你想要什么使用XPath只 –

+0

也许我可以做一个巨大的,如果:-( – itwb

+1

你或许可以创建一个正则表达式语句来替换任何“ - ”或' “那是<值名称=‘ACCOUNT_NUMBER’>标签或查询之间的所有瓦尔[@account_number]使用XPath节点和重写他们的价值 –

回答

2

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

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

将输出997139

可以使用,然后(代码行打破了可读性):

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

注意列入的第二个参数的空白翻译必要'- '(甚至'-&#x20;')删除空格。

+1

如果你需要一个自定义功能一定要规范你的数据,而不是翻译,你可以制作自己的扩展功能:http://lxml.de/extensions.html – Udi

0

不幸的是,libxml2的环境只支持XPath 1.0,所以你没有访问的XPath 2.0的正则表达式功能,如火柴()函数。然而,它确实有支持添加自己的扩展函数(见http://xmlsoft.org/XSLT/extensions.html),所以你可以考虑这个做自己。什么也没有“ -