Обход структуры XML, чтобы определить, существует ли определенный текстовый узел - PullRequest
2 голосов
/ 23 апреля 2009

Хорошо, у меня есть XML-документ, который выглядит примерно так:

    <xml>
     <list>
      <partner>
       <name>Some Name</name>
       <status>active</status>
       <id>0</id>
      </partner>
      <partner>
       <name>Another Name</name>
       <status>active</status>
       <id>1</id>
      </partner>
    </list>
   </xml>

Я использую lib-xml в ruby ​​для его анализа. Я хочу выяснить, есть ли партнер с именем «Некоторое имя» быстрым и рубиновым идиоматическим способом.

Как я могу сделать это в одной строке или в коде ruby, при условии, что у меня есть документ, проанализированный в переменной с именем document. Мне приходилось делать это несколько раз в немного разных сценариях, и теперь это начинает меня беспокоить.

Я знаю, что могу сделать следующее (но это уродливо)

 found = false
 document.find('//partner/name').each do |name|
  if (name.content == 'Some Name')
   found = true
   break
  end
 end
 assert(found, "Some Name should have been found")

но я нахожу это действительно безобразным. Я думал об использовании перечисления включить? Метод mixin, но это все равно не сработает, потому что мне нужно получить поле .content каждого узла, а не фактического узла ... При написании этого я думал об этом (но это выглядит несколько неэффективно, хотя и элегантно)

found = document.find('//partner/name').collect{|name| name.content}.member?("Some Name")

Есть ли другие способы сделать это?

Ответы [ 3 ]

2 голосов
/ 23 апреля 2009

Как насчет этого?

found = document.find("//partner[name='Some Name']").empty?
2 голосов
/ 23 апреля 2009

Я пробовал это решение:

 found = document.find("//partner[name='Some Name']") != nil

но я получил сообщение о том, что выражение xpath недопустимо. Тем не менее, я читал некоторую документацию по xpath, похоже, вы можете вызвать функцию text () в выражении, чтобы получить текстовый узел. Я попробовал следующее, и это, кажется, работает:

 found = document.find("//partner/name/text()='Some Name'")

найдено на самом деле не узел xml, а объект true / false, так что это работает.

0 голосов
/ 23 апреля 2009

Я бы использовал язык, который изначально работает с XML (например, XQuery). С помощью XQuery можно сформулировать запросы такого типа по данным XML кратким и элегантным способом.

...