Как Perl XML :: Simple может игнорировать HTML, встроенный в XML? - PullRequest
3 голосов
/ 15 апреля 2010

У меня есть файл XML, который я извлекаю из Интернета и анализирую. Одним из элементов в XML является значение «content», которое имеет HTML. Я использую XML :: Simple :: XMLin для анализа файла следующим образом:

$xml= eval { $data->XMLin($xmldata, forcearray => 1, suppressempty=> +'') };

Когда я использую Data::Dumper для выгрузки хэша, я обнаружил, что SimpleXML анализирует HTML в хэш-дереве:

'content' => {
      'div' => [
                 {
                   'xmlns' => 'http://www.w3.org/1999/xhtml',
                   'p' => [
                       {
                         'a' => [
                             {
                                'href' => 'http://miamiherald.typepad.com/.a/6a00d83451b26169e20133ec6f4491970b-pi',
                               'style' => 'FLOAT: left',
                               'img' => [
                                   etc.....

Это не то, что я хочу. Я хочу просто захватить содержимое внутри этой записи. Как мне это сделать?

Ответы [ 4 ]

3 голосов
/ 16 апреля 2010

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

3 голосов
/ 15 апреля 2010
#!/usr/bin/perl

use strict; use warnings;

use XML::LibXML::Reader;
my $reader = XML::LibXML::Reader->new(IO => \*DATA)
    or die "Cannot read XML\n";

if ( $reader->nextElement('content') ) {
    print $reader->readInnerXml;
}

__DATA__
<content>
<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://miamiherald.typepad.com/" style="float:left"><img
src="tada"/></a></p>
</div>
</content>

Выход:

<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://miamiherald.typepad.com/" style="float:left"><img src="tada"/
></a></p>
</div>
2 голосов
/ 15 апреля 2010

Если HTML включен непосредственно в XML (вместо экранирования или внутри CDATA), то XML :: Simple не может знать, где прекратить синтаксический анализ.

Однако вы можете восстановить только HTML, передав эту часть структуры данных функции XML::Simple XMLout().

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

Если HTML-код не находится внутри конструкции CDATA или иным образом не закодирован, то вы можете сделать небольшой взлом.

Перед обработкой с помощью XML :: Simple найдите содержимое тега <my_html>, который предположительно является подозрительным для HTML, и передайте его через кодировщик сущности HTML ("<" => "& lt '" и т. Д.), Например HTML: : Сущности. Затем вставьте закодированное содержимое вместо исходного содержимого тега <my_html>.

Это ОЧЕНЬ хакерский, ОЧЕНЬ легкий сделать неправильно, если вы не знаете на 100%, что вы делаете с регулярными выражениями, и делать это не следует.

Сказав это, это решит вашу проблему.

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