Как вы знаете, когда использовать анализатор XML и когда использовать ActiveResource? - PullRequest
2 голосов
/ 10 августа 2009

Я пытался использовать ActiveResource для разбора веб-службы, которая была больше похожа на HTML-документ, и я продолжал получать ошибку 404.

Нужно ли использовать для этой задачи анализатор XML вместо ActiveResource?

Я предполагаю, что ActiveResource полезен только в том случае, если вы потребляете данные из другого приложения Rails, а данные XML легко переводятся в модель Rails. Например, если веб-служба представляет собой более широкий XML-код, такой как документ HTML или RSS-канал, вы хотите использовать синтаксический анализатор, например hpricot или nokogiri. Это правильно?

Как вы знаете, когда использовать анализатор XML, а когда использовать ActiveResource?

Ответы [ 2 ]

7 голосов
/ 10 августа 2009

Обновление: ActiveResource также не является анализатором XML. Это потребитель REST, позволяющий вам взаимодействовать с удаленным ресурсом, аналогично тому, как вы бы использовали модель ActiveRecord. Он использует XML-парсер изнутри (я предполагаю, что через XmlMini ActiveSupport я покажу ниже).

ActiveResource имеет некоторые строгие требования к структуре содержимого XML и лучше всего работает при взаимодействии с REST API другого приложения Rails. Он не предназначен для общего просмотра экрана HTML-страницы. Для этого используйте Нокогири напрямую.


ActiveSupport не является синтаксическим анализатором XML, это разнообразная коллекция полезных методов и классов Ruby. Тем не менее, он предлагает обертку вокруг множества различных анализаторов XML, предоставляя вам согласованный интерфейс.

Вы можете увидеть, какой анализатор XML используется, и переключиться на другой анализатор XML. Попробуйте это в script/console.

ActiveSupport::XmlMini.backend # => ActiveSupport::XmlMini_REXML
ActiveSupport::XmlMini.backend = 'Nokogiri'
ActiveSupport::XmlMini.backend # => ActiveSupport::XmlMini_Nokogiri
# it will now use Nokogiri

Тем не менее, он по-прежнему будет использовать синтаксический анализатор XML в Nokogiri, который предполагает строгую допустимую разметку. Большинство HTML-страниц не соответствуют этому строгому требованию, и поэтому лучше использовать HTML-анализатор Nokogiri напрямую, а не использовать ActiveSupport.

doc = Nokogiri::HTML(...)
4 голосов
/ 16 ноября 2009

Я написал XmlMini, потому что хотел ответить на тот же вопрос. XmlMini на самом деле ничего не делает, и это позволяет ему оставаться сосредоточенным. Но если у вас возникнут проблемы, с которыми не справляются YAML или JSON, XmlMini тоже не справится с этой задачей.

Например, если вам нужно проверить структуру XML, с которым вы имеете дело, XmlMini не является инструментом. Проверка вручную - это ужасно.

Точно так же, если вы имеете дело с данными, которые используют стандартную семантику элементов и атрибутов откуда-то еще, например, включая фрагменты UBL, OpenDoc или Atom, вы действительно должны получить более совершенные инструменты для пространств имен.

Райанб упоминает о Нокогири, и я не могу придумать ничего более прекрасного для этих вещей. Он обладает всей мощью libxml и обладает большей элегантностью, чем почти любая библиотека в Ruby. Я имею в виду не только разбор XML, но и лучшие проекты _why.

Но есть некоторые вещи, для которых даже Нокогири не предназначен. Если вам действительно, безусловно, необходимо убить каждую угловую скобку в комнате на скорости разрыва шеи, вы должны уничтожить SAX. Но если вам так нужна скорость, не делайте этого в Ruby. Делайте это в expat или libxml с чистым C. Или вообще не делайте этого.

...