Как проанализировать тег <rss>с XML :: LibXML, чтобы найти определения xmlns - PullRequest
0 голосов
/ 09 февраля 2019

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

Каков наилучший способ сканирования пространства имен xml в URL-адресе RSS, используя XML :: LibXML

Например:

Один канал может быть

<rss 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:wfw="http://wellformedweb.org/CommentAPI/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

Другой канал может быть

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom">

Я хочу включить в мой скрипт оценку всех используемых пространств имен, чтобы при синтаксическом анализе rss соответствующее полеимена могут быть отслежены.

Не уверен, как это будет выглядеть, так как я не уверен, что у этого модуля есть возможность выполнить атомизацию атрибута тега <rss>, которую я хочу.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Я знаю, что ОП уже принял ответ.Но для полноты картины следует упомянуть, что рекомендуемый способ сделать поиск в DOM устойчивым - это использовать XML :: LibXML :: XPathContext :

#!/usr/bin/perl
use strict;
use warnings;

use XML::LibXML;

my @examples = (
    <<EOT
<rss xmlns:atom="http://www.w3.org/2005/Atom">
  <atom:test>One Ring to rule them all,</atom:test>
</rss>
EOT
    ,
    <<EOT
<rss xmlns:a="http://www.w3.org/2005/Atom">
  <a:test>One Ring to find them,</a:test>
</rss>
EOT
    ,
    <<EOT
<rss xmlns="http://www.w3.org/2005/Atom">
  <test>The end...</test>
</rss>
EOT
    ,
);

my $xpc = XML::LibXML::XPathContext->new();
$xpc->registerNs('atom', 'http://www.w3.org/2005/Atom');

for my $example (@examples) {
    my $dom = XML::LibXML->load_xml(string => $example)
        or die "XML: $!\n";

    for my $node ($xpc->findnodes("//atom:test", $dom)) {
        printf("%-10s: %s\n", $node->nodeName, $node->textContent);
    }
}

exit 0;

, т.е. вы назначаете локальныйпрефикс пространства имен для интересующих вас пространств имен.

Вывод:

$ perl dummy.pl
atom:test : One Ring to rule them all,
a:test    : One Ring to find them,
test      : The end...
0 голосов
/ 10 февраля 2019

Я не уверен, что точно понимаю, какой вывод вы ищете, но XML::LibXML действительно может перечислить пространства имен:

use warnings;
use strict;
use XML::LibXML;

my $dom = XML::LibXML->load_xml(string => <<'EOT');
<rss 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:wfw="http://wellformedweb.org/CommentAPI/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">
</rss>
EOT
for my $ns ($dom->documentElement->getNamespaces) {
    print $ns->getLocalName(), " / ", $ns->getData(), "\n";
}

Вывод:

content / http://purl.org/rss/1.0/modules/content/
wfw / http://wellformedweb.org/CommentAPI/
dc / http://purl.org/dc/elements/1.1/
atom / http://www.w3.org/2005/Atom
sy / http://purl.org/rss/1.0/modules/syndication/
slash / http://purl.org/rss/1.0/modules/slash/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...