Замените тег SVG <g>с помощью Nokogiri - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь заменить тег SVG с помощью Nokogiri, но я не могу найти способ заменить тег.

Моя попытка:

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

Возвращается ошибка:

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

Как мне заменить тег в SVG с помощью Nokogiri?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Если вы хотите изменить один идентификатор на другой - просто назначьте его.

require 'nokogiri'

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

File.write("new.svg", doc.to_xml)
0 голосов
/ 31 января 2019

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

...