Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中从XML文档中删除重复的注释?_Xml_Perl_Xml Sitemap - Fatal编程技术网

如何在Perl中从XML文档中删除重复的注释?

如何在Perl中从XML文档中删除重复的注释?,xml,perl,xml-sitemap,Xml,Perl,Xml Sitemap,我有一个带有重复节点的站点地图视频文件xml: <?xml version="1.0"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"> <url> <loc>http://www.tubtun.com/video/Samsung_42Channel

我有一个带有重复节点的站点地图视频文件xml:

<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"> 
<url>
<loc>http://www.tubtun.com/video/Samsung_42Channel_Wireless_SoundStand</loc>
<video:video>
    <video:title>Samsung 42Channel Wireless SoundStand</video:title>
    <video:description>Samsung 4.2Channel Wireless SoundStand</video:description>
    <video:thumbnail_loc>http://www.tubtun.com/media/files_thumbnail/user91/pl_5364844b0dc.jpg</video:thumbnail_loc>
    <video:player_loc>http://www.tubtun.com/modules/vPlayer/vPlayer.swf?f=http://www.tubtun.com/modules/vPlayer/vPlayercfg.php?fid=844b0dc2c7258f4de11</video:player_loc>
    <video:publication_date>2015-01-27</video:publication_date>
</video:video>
</url>
<url>
<loc>http://www.tubtun.com/video/Samsung_42Channel_Wireless_SoundStand</loc>
<video:video>
    <video:title>Samsung 42Channel Wireless SoundStand</video:title>
    <video:description>Samsung 4.2Channel Wireless SoundStand</video:description>
    <video:thumbnail_loc>http://www.tubtun.com/media/files_thumbnail/user91/pl_5364844b0dc.jpg</video:thumbnail_loc>
    <video:player_loc>http://www.tubtun.com/modules/vPlayer/vPlayer.swf?f=http://www.tubtun.com/modules/vPlayer/vPlayercfg.php?fid=844b0dc2c7258f4de11</video:player_loc>
    <video:publication_date>2015-01-27</video:publication_date>
</video:video>
</url>
.....
不幸的是,文件“clearized.xml”与sitemap.xml相同


我不知道我的脚本出了什么问题。

我不太清楚为什么您的
XML::LibXML
不起作用,尽管如注释中所述-如果它不与
一起工作,那么查找
,这将是它的根源

我将提供一个使用
XML::Twig
的替代方案

#!/usr/bin/env perl 
use strict;
use warnings;
use XML::Twig; 

my $file = 'test3.xml';

my %seen;

sub delete_url_if_seen {
   my ( $twig, $url ) = @_; 
   my $name = $url -> get_xpath('./video:video/video:title',0) -> trimmed_text;
   if ( $seen{$name}++ ) { $url -> delete; };
}

my $twig = XML::Twig -> new ( 'pretty_print' => 'indented_a', 
                   'twig_handlers' => { 'url' => \&delete_url_if_seen } );
$twig -> parsefile_inplace ( $file );

我已经开始工作了,下面是代码&我尝试了中提供的解决方案

您应该使用并注册视频和默认名称空间。您还应该调用
findvalue
以获取标题作为字符串

my $xpc = XML::LibXML::XPathContext->new();
$xpc->registerNs(sitemap => 'http://www.sitemaps.org/schemas/sitemap/0.9');
$xpc->registerNs(video   => 'http://www.google.com/schemas/sitemap-video/1.1');
for my $node ($xpc->findnodes('//sitemap:url', $doc)) {
    my $name = $xpc->findvalue('video:title', $node);
    ...
}

您是否检查了
$name
的内部内容?您的脚本是否说打印
foo duplicated
输出?然后您发现了问题。
$uni->find('video:title')
无法正常工作。您可能需要检查如何在XML::LibXML中使用名称空间前缀,以及如何从元素中提取文本节点。我很难相信您的代码与OP的原始代码有任何不同。您所做的只是将XPath
//url
更改为
//*[name()='url']
,当节点没有名称空间时,这是相同的,如下所示。您还试图使用LibXML一无所知的
video
名称空间。请显示您的示例输入数据和结果输出。查找结果也略有不同。@Borodin我不太确定,但我认为这与XML名称空间有关,我在这里读到一个类似的问题@Borodin video提到了一个ns&我无法在任何在线IDE上运行代码供您查看,因为没有安装XML::LibXML
use strict;
use warnings;
use XML::LibXML;

my $file = 'sitemap.xml';
my $doc = XML::LibXML->load_xml( location => $file );

my %seen;
foreach my $uni ( $doc->findnodes("//*[name() ='url']") ) {  # 'university' nodes only

    my $name = $uni->find('//video:title');
    print "'$name' duplicated\n",
      $uni->unbindNode() if $seen{$name}++;  # Remove if seen before
}

$doc->toFile('clarified.xml'); # Print to file
my $xpc = XML::LibXML::XPathContext->new();
$xpc->registerNs(sitemap => 'http://www.sitemaps.org/schemas/sitemap/0.9');
$xpc->registerNs(video   => 'http://www.google.com/schemas/sitemap-video/1.1');
for my $node ($xpc->findnodes('//sitemap:url', $doc)) {
    my $name = $xpc->findvalue('video:title', $node);
    ...
}