Я знаю, как анализировать XML-документ с помощью Nokogiri. У меня есть один элемент, в котором я хочу пересортировать текстовые строки, поэтому я думал либо о редактировании на месте, либо просто о написании совершенно нового файла. Кто-нибудь может помочь?
Могу ли я использовать ruby для редактирования XML-файла на месте, как в случае с Nokogiri?
Ответы (1)
Вот пример, вам, конечно, придется изменить его для работы с вашим XML.
Учитывая, что ваш XML выглядит примерно так:
<top>
<node1>
<value>mmm</value>
<value>zzz</value>
<value>ccc</value>
</node1>
<anothernode>
<value>zzz</value>
<value>ccc</value>
</anothernode>
</top>
И если вы хотите, чтобы дочерние элементы node1 были в алфавитном порядке по значению, вы могли бы сделать:
n = Nokogiri::XML(the_xml_i_wrote_above)
node1 = n.xpath("//node1").first
sorted_children = node1.children.sort{|x,y| x.text <=> y.text }
node1.children.each {|x| x.unlink }
sorted_children.each {|x| node1 << x}
И тогда n.to_s должно быть равно:
<top>
<node1>
<value>ccc</value>
<value>mmm</value>
<value>zzz</value>
</node1>
<anothernode>
<value>zzz</value>
<value>ccc</value>
</anothernode>
</top>
Могут быть более эффективные способы сделать это, в частности, я искал документированный способ разъединения всех дочерних элементов сразу (может быть, node1.children = [] ?) или способ Nokogiri для сортировки узлов. Просмотрите документацию по Nokogiri, чтобы узнать о других способах сделать это.
person
carols10cents
schedule
16.12.2010
Обратите внимание, что вам не нужно отсоединять узлы перед их перемещением. Узел может находиться только в одном месте дерева, поэтому добавление их к элементу автоматически удаляет их со старого места. Я выложил короткую переработку вашего кода, показывающую несколько незначительных улучшений.
- person Phrogz; 17.12.2010
Спасибо вам обоим, это отличный материал
- person AKWF; 19.12.2010