簡體   English   中英

如何根據子元素之一的值刪除XML元素?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM