XML API ответ JSON или хэш? - PullRequest
0 голосов
/ 18 мая 2011

Итак, я использую API, который возвращает только XML, это отстой. Я хочу создать запись базы данных для каждой записи, возвращаемой из API, но я не знаю, как это сделать.

Возвращаемый XML-код огромен и содержит много пробельных символов ... это нормально? Вот пример некоторых из XML.

<!-- ... -->
        <attribute name="item_date">May 17, 2011</attribute>
        <attribute name="external_url">http://missionlocal.org/2011/05/rain-camioneta-part-i/</attribute>
            <attribute name="source" id="2478">Mission Loc@l</attribute>
            <attribute name="excerpt"></attribute>
    </attributes>
</newsitem>

<newsitem
    id="5185807"
    title="Lost Chrome messenger PBR bag and contents (marina / cow hollow)"
    url="http://sf.everyblock.com/lost-and-found/by-date/2011/5/17/5185807/"
    location_name="Van Ness and Filbert"
    schema="lost-and-found"
    schema_id="7"
    pub_date="May 17, 2011, 12:15 p.m."
    longitude="-122.424129925"
    latitude="37.7995100578"
>
    <attributes>
        <attribute name="item_date">May 17, 2011</attribute>
        <attribute name="external_url">http://sfbay.craigslist.org/sfc/laf/2386709187.html</attribute>
    </attributes>
</newsitem>

<newsitem
    id="5185808"
    title="Plywood Update: Dumplings &amp; Buns Aims To Be &quot;Beard Papa Of Chinese Buns&quot;"
    url="http://sf.everyblock.com/news-articles/by-date/2011/5/17/5185808/"
    location_name="2411 California Street"
    schema="news-articles"
    schema_id="5"
    pub_date="May 17, 2011, 12:15 p.m."
    longitude="-122.434000442"
    latitude="37.7888985667"
>
    <attributes>
        <attribute name="item_date">May 17, 2011</attribute>
        <attribute name="external_url">http://sf.eater.com/archives/2011/05/17/dumplings_buns_aims_to_be_beard_papa_of_chinese_buns.php</attribute>
            <attribute name="source" id="2155">Eater SF</attribute>
            <attribute name="excerpt"></attribute>
    </attributes>
</newsitem>

<newsitem
    id="5185809"
    title="Freebies: This week, Piazza D&#39;Angelo (22 Miller..."
    url="http://sf.everyblock.com/news-articles/by-date/2011/5/17/5185809/"
    location_name="22 Miller"
    schema="news-articles"
    schema_id="5"
    pub_date="May 17, 2011, 12:15 p.m."
    longitude="-122.408894997"
    latitude="37.7931966922"
>
    <attributes>
        <attribute name="item_date">May 17, 2011</attribute>
        <attribute name="external_url">http://sf.eater.com/archives/2011/05/17/freebies_24.php</attribute>
            <attribute name="source" id="2155">Eater F</attribute>
            <attribute name="excerpt"></attribute>
<!-- ... -->

Есть идеи?

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Это не совсем допустимый XML. Это своего рода представление XML с экранированной строкой, возможно, вывод на консоль. Это также не кажется полным. Кроме того, это довольно обычный XML. Вот отрывок меньшего размера, неэкранированный и отформатированный:

<newsitem
    id="5185807"
    title="Lost Chrome messenger PBR bag and contents (marina / cow hollow)"
    url="http://sf.everyblock.com/lost-and-found/by-date/2011/5/17/5185807/"
    location_name="Van Ness and Filbert"
    schema="lost-and-found"
    schema_id="7"
    pub_date="May 17, 2011, 12:15 p.m."
    longitude="-122.424129925"
    latitude="37.7995100578">
    <attributes>
        <attribute name="item_date">May 17, 2011</attribute>
        <attribute name="external_url">http://sfbay.craigslist.org/sfc/laf/2386709187.html</attribute>
    </attributes>
</newsitem>

Вам просто нужно определить, что вы хотите извлечь и поместить в базу данных, и это позволит вам принять решение о разработке БД. Вам нужно несколько моделей с неповрежденными отношениями, или вы просто заинтересованы в подмножестве данных?

0 голосов
/ 18 мая 2011

XML может иметь пробелы и не влиять на качество содержащихся в нем данных. Хороший синтаксический анализатор, с помощью которого вы должны обрабатывать XML, не заботится и предоставит вам доступ к данным независимо от того, есть пробелы или нет.

Nokogiri - это мой любимый предмет, и, похоже, в наши дни он фактически является стандартом для Ruby. Он очень прост в использовании, но вам нужно научиться определять, какие узлы вам нужны.

Чтобы начать, вот несколько терминов:

  • Узел - это термин для тега после его анализа.
  • Узлы имеют атрибуты, доступ к которым можно получить с помощью node_var['attribute'].
  • Доступ к тексту узла можно получить с помощью node_var.text или node_var.content или node_var.inner_text.
  • NodeSet - это в основном массив узлов.
  • at возвращает первый узел, соответствующий методу доступа, который вы предоставляете парсеру. % это псевдоним.
  • search возвращает NodeSet узлов, соответствующих методу доступа, который вы предоставляете синтаксическому анализатору. / это псевдоним.

Вот как мы можем разобрать фрагмент XML:

require 'nokogiri'

xml =<<EOT
<newsitem
    id="5185807"
    title="Lost Chrome messenger PBR bag and contents (marina / cow hollow)"
    url="http://sf.everyblock.com/lost-and-found/by-date/2011/5/17/5185807/"
    location_name="Van Ness and Filbert"
    schema="lost-and-found"
    schema_id="7"
    pub_date="May 17, 2011, 12:15 p.m."
    longitude="-122.424129925"
    latitude="37.7995100578">
    <attributes>
        <attribute name="item_date">May 17, 2011</attribute>
        <attribute name="external_url">http://sfbay.craigslist.org/sfc/laf/2386709187.html</attribute>
    </attributes>
</newsitem>
EOT

doc = Nokogiri::XML(xml)
doc.at('newsitem').text # => "\n    \n        May 17, 2011\n        http://sfbay.craigslist.org/sfc/laf/2386709187.html\n    \n"
(doc % 'attribute').content # => "May 17, 2011"
doc.at('attribute[name="external_url"]').inner_text # => "http://sfbay.craigslist.org/sfc/laf/2386709187.html"

doc.at('newsitem')['id'] # => "5185807"

newsitem = doc.at('newsitem')
newsitem['title'] # => "Lost Chrome messenger PBR bag and contents (marina / cow hollow)"

attributes = doc.search('attribute').map{ |n| n.text } 
attributes # => ["May 17, 2011", "http://sfbay.craigslist.org/sfc/laf/2386709187.html"]

attributes = (doc / 'attribute').map{ |n| n.text } 
attributes # => ["May 17, 2011", "http://sfbay.craigslist.org/sfc/laf/2386709187.html"]

Все виды доступа используют CSS, так же, как вы используете при написании веб-страниц. Это проще и, как правило, более понятно, но Nokogiri также поддерживает XPath, который является очень мощным и позволяет перенести большую часть обработки в базовую библиотеку libXML2, которая будет работать очень быстро.

Nokogiri очень хорошо работает с Ruby's Open-URI, поэтому, если вы получаете XML с веб-сайта, вы можете сделать это следующим образом:

require 'open-uri'
require 'nokogiri'

doc = Nokogiri::HTML(open('http://www.example.com'))
doc.to_html.size # => 2825

Это синтаксический анализ HTML, в котором Nokogiri также отличается, но процесс для XML такой же, просто замените Nokogiri::HTML на Nokogiri::XML.

См. Также " Как избежать объединения всего текста с узлов при извлечении ".

...