2

我有一个看起来像这样的 xml 元素:

<Description>
    <ID>1234</ID>
    <SubDescription>
        <subID>4501</subID>
    </SubDescription>
    <SubDescription>
        <subID>4502</subID>
    </SubDescription>
</Description>

如何根据其“ID”子元素的值删除整个“描述”元素?

4

3 回答 3

2

您可以使用以下 xpath 选择包含值为 1234 的 ID 节点的描述节点:

//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>

如您所见,所需的描述节点已被删除。

于 2012-12-11T19:02:57.530 回答
0

我个人会使用@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
于 2012-12-13T07:59:02.953 回答
-3

要查找 ID,请执行以下操作:

id = doc.xpath("//ID").text

其中 doc 是通过加载 xml 文档创建的 Nokogiri 对象

要检查元素 id 是否是您想要的,请尝试:

if id == "1234"

从您的 xml 文件中,这应该返回 true

最后删除整个描述使用:

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."
于 2012-12-11T18:18:54.700 回答