2015-04-24 2 views
0

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

string = " <SET-TOPIC>INITIATE</SET-TOPIC> 

    <SETPROFILE> 
     <PROFILE-KEY>predicates_live</PROFILE-KEY> 
     <PROFILE-VALUE>yes</PROFILE-VALUE> 
    </SETPROFILE> 

    <think> 
     <set><name>first_time_initiate</name>yes</set> 
    </think> 

    <SETPROFILE> 
     <PROFILE-KEY>first_time_initiate</PROFILE-KEY> 
     <PROFILE-VALUE>YES</PROFILE-VALUE> 
    </SETPROFILE>" 

Моей цель состоит в том, чтобы иметь возможность считывать каждый верхний уровень, который находится в шапках с разбором , Я использую оператор case, чтобы оценить, что такое ключ верхнего уровня, например <SETPROFILE>, но может быть много разных значений, а затем запустить метод, который выполняет разные действия с помощью тегов.

Что это означает, что мне нужно, чтобы иметь возможность очень легко узнать:

  • top_level_keys = ['SET-TOPIC', 'SET-PROFILE', 'SET-PROFILE']
  • , когда я прохожу в ключе знать полную стоимость
  • parsed[0].value = {:PROFILE-KEY => predicates_live, :PROFILE-VALUE => yes}
  • parsed[0].key = ['SET-TOPIC']

В настоящее время я разбираю всю строку следующим образом:

doc = Nokogiri::XML::DocumentFragment.parse(string) 
parsed = doc.search('*').each_with_object({}){ |n, h| 
    h[n.name] = n.text 
} 

В результате я разбираю и знаю только второй тег. Значения из первого тега не отображаются в переменной parsed.

У меня есть контроль над тегами, если это помогает.

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

Примечание: строка также содержит только обычный текст, как до, так и после XML-подобных тегов.

ответ

0

Это зависит от того, чего вы собираетесь достичь. Проблема в том, что вы переопределяете хеш-ключи новыми значениями. Самый простой способ для сбора значений - хранить их в массиве:

parsed = doc.search('*').each_with_object({}) do |n, h| 
    # h[n.name] = n.text :: removed because it overrides values 
    (h[n.name] ||= []) << n.text 
end 
+0

Спасибо. Если мы удалим переопределение и создадим массив, это будет нормально. Есть ли недостаток или торговля таким образом? – Angela

+0

Моя цель - иметь способ, который может анализировать каждый отдельный тег и применять метод. Затем различные узлы принимают разобранные значения, применяют соответствующий метод, затем вычеркивают тег из строки или заменяют его на основе метода. – Angela

+0

Я получаю сообщение об ошибке: 'TypeError: no implicit conversion of Symbol into Integer' мы превращаем хэш в массив? – Angela

Смежные вопросы