[英]How to delete an XML element according to value of one of its children?
我有一個看起來像這樣的xml元素:
<Description>
<ID>1234</ID>
<SubDescription>
<subID>4501</subID>
</SubDescription>
<SubDescription>
<subID>4502</subID>
</SubDescription>
</Description>
如何根據“ ID”子元素的值刪除整個“描述”元素?
您可以使用以下xpath選擇包含ID值為1234的ID節點的Description節點:
//Description[./ID[text()='1234']]
因此,要刪除該節點,您可以執行以下操作:
doc.xpath("//Description[./ID[text()='1234']]").remove
例:
require 'nokogiri'
str = %q{
<root>
<Description>
<ID>2222</ID>
<SubDescription>
<subID>4501</subID>
</SubDescription>
<SubDescription>
<subID>4502</subID>
</SubDescription>
</Description>
<Description>
<ID>1234</ID>
<SubDescription>
<subID>4501</subID>
</SubDescription>
<SubDescription>
<subID>4502</subID>
</SubDescription>
</Description>
</root>
}
doc = Nokogiri::XML(str)
doc.xpath("//Description[./ID[text()='1234']]").remove
puts doc
#=> <root>
#=> <Description>
#=> <ID>2222</ID>
#=> <SubDescription>
#=> <subID>4501</subID>
#=> </SubDescription>
#=> <SubDescription>
#=> <subID>4502</subID>
#=> </SubDescription>
#=> </Description>
#=></root>
如您所見,所需的描述節點已刪除。
我個人將使用@JustinKo的解決方案,盡管使用了更簡單的XPath:
doc.xpath("//Description[ID='1234']").remove
但是,如果制作XPath並不是您的樂趣所在,而編寫Ruby就是您的主意,那么您可以更加依賴Ruby(如果效率略低):
doc.css('ID').select{ |el| el.text=="1234" }.map(&:parent).each(&:remove)
說的是:
<ID>
的元素 "1234"
<Description>
節點(在每個節點上調用.parent
的結果) .remove
。 如果您知道只有一場比賽,可以通過以下方法簡化比賽:
doc.css('ID').find{ |el| el.text=="1234" }.parent.remove
要查找ID,請執行以下操作:
id = doc.xpath("//ID").text
其中doc是通過加載xml文檔創建的Nokogiri對象
要檢查元素ID是否是您想要的,請嘗試:
if id == "1234"
從您的xml文件中應返回true
最后刪除整個Description使用:
doc.xpath("//Description").remove
您正在尋找的是:
doc = Nokogiri::XML(File.open("test.xml")) #create Nokogiri object from "test.xml"
id = doc.xpath("//ID").text #this will be a string with the id
doc.xpath("//Description").remove if id == "1234" #returns true with your xml document and remove the entire Description element."
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.