Как я могу удалить дубликаты XML-узлов, используя Ruby? - PullRequest
3 голосов
/ 12 октября 2009

Предположим, у меня есть эта структура:

<one>
   <two>
     <three>3</three>
   </two>

   <two>
     <three>4</three>
   </two>

   <two>
     <three>3</three>
   </two>
</one>

Есть ли способ добраться до этого:

<one>
  <two>
    <three>3</three>
  </two>

  <two>
    <three>4</three>
  </two>

</one>

с использованием библиотек Ruby? Мне удалось получить это с помощью Нокогири. Судя по моим тестам, это работает, но, может быть, есть другой подход, лучше.

Ответы [ 2 ]

5 голосов
/ 13 октября 2009

Как насчет того, что делает все это в две строки?

seen = Hash.new(0)
node.traverse {|n| n.unlink if (seen[n.to_xml] += 1) > 1}

Если существует вероятность того, что один и тот же узел появится под двумя разными родителями, и вы не хотите, чтобы они считались дубликатами, вы можете изменить эту вторую строку на:

node.traverse {|n| n.unlink if (seen[(n.parent.path rescue "") + n.to_xml] += 1) > 1}
0 голосов
/ 12 октября 2009

Эта страница немного объясняет синтаксический анализ XML в Ruby http://developer.yahoo.com/ruby/ruby-xml.html

На этой странице объясняются некоторые причины, по которым вы хотите использовать правильный анализатор для чего-то вроде регулярных выражений: http://htmlparsing.icenine.ca

На первый взгляд подход, который вы используете, не кажется ужасным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...