使用 Nokogiri 替换 SVG <g> 标签

Replace an SVG <g> tag using Nokogiri

我正在尝试使用 Nokogiri 替换 SVG 标签,但我似乎找不到替换标签的方法。

我的尝试:

xml = Nokogiri.parse sample.svg
xml.search("//xmlns:g[@id='Placements']")

虽然它找到了id为Placements的标签,但是用另一个标签替换标签的方法是什么?

我试过了:

xml = Nokogiri.parse sample.svg
xml.search("//xmlns:g[@id='Placements']").replace '<g id=example></g>'

它return一个错误:

undefined method `replace' for #<Nokogiri::XML::NodeSet:0x00007f4e458bbb78>

如何使用 Nokogiri 替换 SVG 中的标签?

https://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/NodeSet

为您提供可以对该节点集执行的所有操作的列表。问题是你想彻底改变其中的一切吗?这将包括嵌套在其中的所有节点。只是检查你只会得到一个结果,因为搜索允许找到多个节点并将其放入要查看的节点集中。

如果你确定你在你想去的地方并且想完全改变/删除你想要的节点集

xml.search("//xmlns:g[@id='Placements']").before('<g id=example></g>')

然后删除您 select编辑的集合:

xml.search("//xmlns:g[@id='Placements']").delete

这里让我困扰的是它给你一个节点集,这意味着你有多个标签。尝试这样做:

xml.search("//xmlns:g[@id='Placements']").length

确保您拥有所需的单一标签。正在做:

i = 0
xml.search("//xmlns:g[@id='Placements']").each do |node|
  puts node
  puts i
  i += 1
end

可以让您更好地了解您想要的特定节点。然后在你想要的特定节点的索引的帮助下,你可以简单地 select 它与:

xml.search("//xmlns:g[@id='Placements']")[i]

将 i 更改为特定索引位置。 我看到的问题是你仍然不在你想要更改的单一节点上,因为它声称 return 一个节点集给你。

一旦你找到你的单一节点,替换应该工作: https://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Node

如果您想将一个 ID 更改为另一个 - 只需分配它即可。

require 'nokogiri'

doc = Nokogiri::XML(File.read("sample.svg"))
doc.css('g#Placements')[0]["id"] = "example"

File.write("new.svg", doc.to_xml)