繁体   English   中英

如何使用XPath选择以下特定的XML节点?

[英]How to select the following specific XML nodes using XPath?

我有一个如下的XML文档:

<Objects>
  <object distName="a/b">  </object>
  <object distName="a/b/c1">  </object>
  <object distName="a/b/c4/d/e">  </object>
  <object distName="a/b/c2">  </object>
  <object distName="a/b/c6/d">  </object>
</Objects>

我需要选择所有路径均以“ c” + number结尾的节点。 例如:“ a / b / c1 ”和“ a / b / c2 ”,但不喜欢“ a / b / c6 / d ”,也不喜欢“ a / b / c4 / d / e ”。

如果我尝试以下操作:

      `cNodes = xmlDoc.xpath("//object[contains(@path, `a/b/c`)]")`

然后,这将包括我不需要的“ a / b / c6 / d”和“ a / b / c4 / d / e”。

因此,有没有一种方法可以用一行或两行代码来完成这项工作。 我的意思是,我可以像一个循环之类的东西来做到这一点,而我不想这样做。 那是因为真正的XML文档是数千个节点。

PS:Python 2.7,lxml

恐怕使用纯XPath 1.0( lxml支持的XPath版本)无法完成此操作。

或者,您可以尝试使用/分割属性,获取最后的分割结果,然后使用列表推导在一行中检查它是否以c开头,例如:

>>> raw = '''<Objects>
...   <object distName="a/b">  </object>
...   <object distName="a/b/c1">  </object>
...   <object distName="a/b/c4/d/e">  </object>
...   <object distName="a/b/c2">  </object>
...   <object distName="a/b/c6/d">  </object>
... </Objects>'''
... 
>>> from lxml import etree
>>> xmlDoc = etree.fromstring(raw)
>>> cNodes = xmlDoc.xpath("//object[contains(@path, 'a/b/c')]")
>>> result = [etree.tostring(n) for n in cNodes if n.attrib["distName"].split('/')[-1].startswith("c")]
>>> print result
['<object distName="a/b/c1">  </object>\n  ', '<object distName="a/b/c2">  </object>\n  ']

不幸的是,使用XPath 1.0表示匹配模式的条件并不是很简单。 但是,如果您可以对要查找的内容做出某些假设,则可以进行这样的查询。

//object[starts-with(@distName, 'a/b/c') and substring-after(@distName, 'a/b/c') >= 0]

distName它,我们首先检查distName属性是否以a/b/c开头。 然后,如果该字符串之后的所有内容都是某个数字。 根据您的需求,这可能就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM