使用Nokogiri替换SVG <g>标签

时间:2019-01-31 06:59:10

标签: ruby-on-rails ruby nokogiri

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

我的尝试

/usr/include/x86_64-linux-gnu/bits/stdint-intn.h

虽然找到ID为xml = Nokogiri.parse sample.svg xml.search("//xmlns:g[@id='Placements']") 的标签,但是用另一个标签替换标签的方法是什么?

我尝试过:

Placements

返回错误:

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

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

2 个答案:

答案 0 :(得分:1)

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

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

如果您确定自己想去的地方,并且想要完全更改/删除节点集,那么

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

然后删除您选择的集合:

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

可以让您更好地了解所需的特定节点。然后,借助所需的特定节点的索引,只需使用以下命令即可选择它:

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

更改i的具体索引位置。 我看到的问题是您仍然不在您要更改的单个节点上,因为它声称要向您返回节点集。

一旦发现替换的奇异节点应该起作用: https://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Node

答案 1 :(得分:1)

如果要将一个ID更改为另一个ID,只需分配它即可。

require 'nokogiri'

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

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