Попытка разобрать XML в Perl, но длинная строка данных обрезается - PullRequest
2 голосов
/ 06 июня 2011

Я попытался проанализировать XML-файл с XML :: Simple и XML :: Twig с тем же результатом. Другие поля в файле работают просто отлично.

Файл, о котором идет речь, можно найти здесь:

curl -s "http://apps.nlm.nih.gov/medlineplus/services/mpconnect_service.cfm?mainSearchCriteria.v.cs=2.16.840.1.113883.6.103&mainSearchCriteria.v.c=130"

Это проблема с парсером или файлом? Вывод был одинаковым с обоими парсерами. HTML-теги в строке хранятся в формате XML

Поле ввода (внутри xml-тегов с именем 'summary'):

<summary type="html">&lt;p&gt;Toxoplasmosis is a disease caused by the parasite &lt;em&gt;Toxoplasma gondii&lt;/em&gt;. More than 60 million people in the U.S. have the parasite.  Most of them don't get sick. But the parasite causes serious problems for some people. These include people with weak immune systems and babies whose mothers become infected for the first time during pregnancy. Problems can include damage to the brain, eyes and other organs.&lt;/p&gt;&#xd;^I&#xd;&lt;p&gt;You can get toxoplasmosis from &lt;/p&gt;&#xd;&lt;ul&gt;&#xd;&lt;li&gt;^IWaste from an infected cat&lt;/li&gt;&#xd;&lt;li&gt;^IEating contaminated meat that is raw or not well cooked &lt;/li&gt;&#xd;&lt;li&gt;^IUsing utensils or cutting boards after they've had contact with raw meat &lt;/li&gt;&#xd;&lt;li&gt;^IDrinking infected water &lt;/li&gt;&#xd;&lt;li&gt;^IReceiving an infected organ transplant or blood transfusion&lt;/li&gt;&#xd;&lt;/ul&gt;&#xd;&lt;p&gt;Most people with toxoplasmosis don't need treatment. There are drugs to treat it for pregnant women and people with weak immune systems. &lt;/p&gt;&#xd;&#xd;&lt;p class="NLMattribution"&gt;Centers for Disease Control and Prevention&lt;/p&gt;</summary>

Вывод после разбора XML:

<p>Toxoplasmosis is a disease caused by the parasite <em>Toxoplasma gondii</em>. More than 60 million people in the U.S. have the parasite.  Most of them don't get sick. But the parasite causes serious problems for some people. These include people with weak im<p class="NLMattribution">Centers for Disease Control and Prevention</p>to treat it for pregnant women and people with weak immune systems. </p>her organs.</p>

Решение проблемы: XML-файлы содержат возврат каретки "& # xd;" что вызывает проблемы для парсеров. После загрузки файлов XML я удалил возврат каретки со следующей строкой:

sed -i 's/&#xd;//g' *.xml

Парсеры теперь работают как положено.

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

1 Ответ

2 голосов
/ 06 июня 2011

Я получаю некоторые странные результаты при разборе curl как канала (используя XML::Twig->new->parse( curl -s "http://..." |): содержимое выглядит усеченным, изменяется от вызова к вызову ...

Все выглядит лучше, если я анализирую файлсозданный из результата curl, или родного метода parseurl XML :: Twig, тогда результат будет постоянным, и что вы хотите:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $twig    = XML::Twig->new->parseurl( "http://apps.nlm.nih.gov/medlineplus/services/mpconnect_service.cfm?mainSearchCriteria.v.cs=2.16.840.1.113883.6.103&mainSearchCriteria.v.c=130" );
my $summary = $twig->first_elt( 'summary');

print $summary->text, "\n";

Честно говоря, я понятия не имею, почему это происходит.Я попытаюсь разобраться в этом немного больше, но я подозреваю, что ничего не могу поделать: если проблема проявляется как в XML :: Simple, так и в XML :: Twig, то, вероятно, она находится на более низком уровне стека, XML:: Парсер или экспат и их взаимодействие с curl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...