Анализ ruby ​​xml: `dup': невозможно дублировать NilClass (TypeError)

Я разбираю Xml Recod с использованием Ruby. XML-файл имеет следующую структуру данных:

<row Id="27" PostTypeId="2" ParentId="11" CreationDate="2008-08-01T12:17:19.357" Score="13" Body="&lt;p&gt;@jeff&lt;/p&gt;&#xD;&#xA;&#xD;&#xA;&lt;p&gt;IMHO yours seems a little long.  However it does seem a lit
    tle more robust with support for &quot;yesterday&quot; and &quot;years&quot;.  But in my experience when this is used the person is most likely to view the content in the first 30 days.  It is only the really har
    dcore people that come after that.  So that is why I usually elect to keep this short and simple.&lt;/p&gt;&#xD;&#xA;&#xD;&#xA;&lt;p&gt;This is the method I am currently using on one of my websites.  This only re
    turns a relative day, hour, time.  And then the user has to slap on &quot;ago&quot; in the output.&lt;/p&gt;&#xD;&#xA;&#xD;&#xA;&lt;pre&gt;&lt;code&gt;public static string ToLongString(this TimeSpan time)&lt;br&g
    t;{&lt;br&gt;    string output = String.Empty;&lt;br&gt;&lt;br&gt;    if (time.Days &amp;gt; 0)&lt;br&gt;        output += time.Days + &quot; days &quot;;&lt;br&gt;&lt;br&gt;    if ((time.Days == 0 || time.Days =
    = 1) &amp;amp;&amp;amp; time.Hours &amp;gt; 0)&lt;br&gt;        output += time.Hours + &quot; hr &quot;;&lt;br&gt;&lt;br&gt;    if (time.Days == 0 &amp;amp;&amp;amp; time.Minutes &amp;gt; 0)&lt;br&gt;        outp
    ut += time.Minutes + &quot; min &quot;;&lt;br&gt;&lt;br&gt;    if (output.Length == 0)&lt;br&gt;        output += time.Seconds + &quot; sec&quot;;&lt;br&gt;&lt;br&gt;    return output.Trim();&lt;br&gt;}&lt;br&gt;
    &lt;/code&gt;&lt;/pre&gt;" OwnerUserId="17" LastEditorUserId="17" LastEditorDisplayName="Nick Berardi" LastEditDate="2008-08-01T13:16:49.127" LastActivityDate="2008-08-01T13:16:49.127" CommentCount="1" CommunityO
    wnedDate="2009-09-04T13:15:59.820" />

Но есть некоторые записи, которые не имеют всех элементов

<row Id="29" PostTypeId="2" ParentId="13" CreationDate="2008-08-01T12:19:17.417" Score="18" Body="&lt;p&gt;There are no HTTP headers that will report the clients timezone so far although it has been suggested t
    o include it in the HTTP specification.&lt;/p&gt;&#xD;&#xA;&#xD;&#xA;&lt;p&gt;If it was me, I would probably try to fetch the timezone using clientside JavaScript and then submit it to the server using Ajax or so
    mething.&lt;/p&gt;" OwnerUserId="19" LastActivityDate="2008-08-01T12:19:17.417" CommentCount="0" />

Мой анализ ruby ​​проходит через эти записи XML и вставляет их в базу данных MySQL:

  def on_start_element(element, attributes)
    if element == 'row'
      @post_st.execute(attributes['Id'], attributes['PostTypeId'], attributes['AcceptedAnswerId'], attributes['ParentId'], attributes['Score'], attributes['ViewCount'], 
        attributes['Body'], attributes['OwnerUserId'] == nil ? -1 : attributes['OwnerUserId'], attributes['LastEditorUserId'], attributes['LastEditorDisplayName'], 
        DateTime.parse(attributes['LastEditDate']).to_time.strftime("%F %T"), DateTime.parse(attributes['LastActivityDate']).to_time.strftime("%F %T"), attributes['Title'] == nil ? '' : attributes['Title'], 
        attributes['AnswerCount'] == nil ? 0 : attributes['AnswerCount'], attributes['CommentCount'] == nil ? 0 : attributes['CommentCount'], 
        attributes['FavoriteCount'] == nil ? 0 : attributes['FavoriteCount'], DateTime.parse(attributes['CreationDate']).to_time.strftime("%F %T"))
      post_id = attributes['Id']

      tags = attributes['Tags'] == nil ? '' : attributes['Tags']
      tags.scan(/<(.*?)>/).each do |tag_name|
        tag_id = insert_or_find_tag(tag_name[0])
        @post_ot_tag_insert_st.execute(post_id, tag_id)
      end
    end
  end

Но во время обработки второй записи, основанной на том, что было вставлено в мою базу данных (последняя запись - запись со строками id=27), я получаю следующую ошибку:

/format.rb:1031:in `dup': can't dup NilClass (TypeError)

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

Это строка, которая получает жалобу:

DateTime.parse(attributes['LastEditDate']).to_time.strftime("%F %T"), DateTime.parse(attributes['LastActivityDate']).to_time.strftime("%F %T"), attributes['Title'] == nil ? '' : attributes['Title'],

Я думаю, что его жалобы на LastEditDate?

0 ответов

Другие вопросы по тегам