Как я могу читать искаженный XML (незашифрованные объекты) с помощью Perl? - PullRequest
1 голос
/ 27 апреля 2010

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

По сути, я задаю тот же вопрос, что и this , но для Perl вместо PHP.

<report>  
  <company>A & W</company>  
  <company>Some Other Company with a < in Inc.</company>
</report>  

Я пытался использовать что-то вроде этого:

my $readAllRecordsURI = "http://mycompany.com/CompanyOnline/GetRecord";
my @form_array = ("action" => "readAll", "table" => "QOPIDINF");

my $ua = LWP::UserAgent->new;

my $cics_request = (POST $readAllRecordsURI, \@form_array);          
my $cics_response = $ua->request($cics_request);
my $xmlfile = $cics_response->content;

my $parser = XML::Parser->new( Handlers => {Char  => \&handle_char});
$parser->parsefile( $xmlfile );


sub handle_char {
   my ($p, $string) = @_;

   #clean up text here...
}

Ответы [ 3 ]

1 голос
/ 28 апреля 2010

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

0 голосов
/ 28 апреля 2010

Взгляните на XML :: Liberal . Похоже, делать то, что вы хотите. Очень простой пример (из одного из модульных тестов ):

my $clean_xml = XML::Liberal->new('LibXML')->parse_string($bad_xml)->to_string()
0 голосов
/ 28 апреля 2010

XML :: Parser / Expat всегда работал хорошо для меня, в том числе с плохо сформированным XML.

Не НЕ анализировать XML с регулярным выражением .... если только ваш синтаксический анализатор не работает>; -} ... Можете ли вы просто удалить имя компании с < в нем перед анализом?

Вот некоторые регулярные выражения, которые нужно попробовать: Неглубокий анализ XML с регулярным выражением - В нижней части этой страницы, я думаю, есть регулярное выражение, которое найдет только правильные теги XML; инвертировать что найти плохо сформирован?

...