2

私は次のようなxml要素を持っています:

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

「ID」の子の値に従って「Description」要素全体を削除するにはどうすればよいですか?

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それらのそれぞれを呼び出します。

一致するものが1つしかないことがわかっている場合は、次の方法で簡単にできます。

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 に答える