2011-05-30 3 views
1

У меня есть документ XML с фрагментами, как следующее:Modify и обертывают XML узлов с nokogiri

<x> 
    abcd 
    <z>ef</z> 
    ghij 
</x> 

Я хочу найти текст «DEFG» внутри узла, и изменить этот узел следующим образом:

<x> 
    abc 
    <y> 
    d<z>ef</z>g 
    </y> 
    hij 
</x> 

Это означает создание нового узла с битом x.text и других детей внутри.

Я могу найти узел, который содержит текст, но я не знаю, как его разбить, и оберните только соответствующий раздел внутри тегов <y>.

Любые идеи, которые могут указывать на меня в правильном направлении, наиболее ценятся. Благодарю.

+0

Я понимаю, что внутри элемента x есть три дочерних элемента: текст (abcd), z (ef) и другой текстовый элемент (ghij). Я мог бы лечить каждого ребенка, обрабатывать его содержимое, а затем воссоздавать новую структуру детей. Есть ли другой способ? Простой, более элегантный ярлык? – fjs6

ответ

1

Как насчет того, чтобы превратить его в укус, а затем использовать регулярное выражение для его изменения, а затем снова проанализировать его с помощью nokogiri.

sting = some_xml.to_s 
# => '<x>abcd<z>ef</z>ghij</x>' 

splits = sting.match(/(.)<z>(.*)<\/z>(.)/) 

new_string = sting.gsub(splits[1], "<y>#{splits[1]}").gsub(splits[3], "#{splits[3]}</y>") 

Nokogiri::XML(new_string) 
Смежные вопросы