Могу ли я вставить необработанную строку XML с помощью Nokogiri? - PullRequest
3 голосов
/ 16 ноября 2011

Я использую Nokogiri для чтения файла XML.Я храню некоторую информацию из текстовых узлов в хэше, который затем использую для написания нового XML-файла с другим порядком элементов.

Однако у меня есть целый блок исходного XML-файла, который я хотел бы сохранить как есть.Я сохраняю его в строке, вызывая метод экземпляра "external_xml" для объекта чтения Nokogiri:

reader = Nokogiri::XML::Reader(File.open(filename))
reader.each do |r|

  bg = r.outer_xml if r.name=="BuyersGuide"

  # store stuff in hash from rest of doc

end

Мой вопрос заключается в том, когда я пишу новый документ XML, используя блок кода ниже:

# Write the new file
builder = Nokogiri::XML::Builder.new do |xml|

  #puts xml.public_methods.sort.join(", ")
  #break

  xml.Data {
    xml.Apps {
      # writing stuff from the hash
    }
  }
end

Как я могу поместить сырые XML-данные в XML-файл, который я использую для создания Nokogiri Builder?В нем уже есть явные элементы, поэтому я не могу позвонить:

xml.BuyersGuide bg

Ответы [ 2 ]

5 голосов
/ 02 сентября 2015

Вы можете сделать это, используя открытые методы (я прочитал принятый ответ, но неудобно было использовать частные методы):

Nokogiri::XML::Builder.new do |xml|
  xml.Data {
    xml.Apps {
      xml << '<foo>bar</foo>'
    }
  }
end.to_xml

Выходы:

<?xml version="1.0"?>
<Data>
  <Apps>
    <foo>bar</foo>
  </Apps>
</Data>
2 голосов
/ 16 ноября 2011

Вы можете использовать приватный метод insert, например:

builder = Nokogiri::XML::Builder.new do |xml|
  xml.Data {
    xml.Apps {
      xml.__send__ :insert, Nokogiri::XML::DocumentFragment.parse('<foo>bar</foo>')
      xml.__send__ :insert, existing_xml_element
    }
  }
end
...