簡體   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