Могу ли я использовать ruby ​​для редактирования XML-файла на месте, как в случае с Nokogiri?

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


person AKWF    schedule 16.12.2010    source источник


Ответы (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
comment
Обратите внимание, что вам не нужно отсоединять узлы перед их перемещением. Узел может находиться только в одном месте дерева, поэтому добавление их к элементу автоматически удаляет их со старого места. Я выложил короткую переработку вашего кода, показывающую несколько незначительных улучшений. - person Phrogz; 17.12.2010
comment
Спасибо вам обоим, это отличный материал - person AKWF; 19.12.2010