XML(LibXML):使用相同内容替换xhtml:h1标记的最简单方法

时间:2013-03-21 07:00:42

标签: xml perl libxml2

我正在使用Perl / CPAN XML::LibXML来解析和操作一个有效的XHTML 1.1文档,该文档包含几个嵌套的< div>标签包含< h1> ,< h2>等

现在,我从那里提取div并且他们的标题从< xhtml:h2 />开始。我要转换为从< xhtml:h1 />开始(即:h2→h1; h3→h2; h4→h3等)。

我如何使用XML :: LibXML?

这是我到目前为止所做的:

    foreach my $h_idx (2 .. 6)
    {
        foreach my $h_tag ($scene_xpc->findnodes(qq{//xhtml:h$h_idx}))
        {
            my $replacement = $h_tag->cloneNode(1);
            # TODO : how do I set the name?
            $replacement->set
            $h_tag->replaceNode($replacement);
        }
    }

1 个答案:

答案 0 :(得分:2)

您似乎已从变量名称$scene_xpc中猜到,您需要定义XML::LibXML::XPathContext已定义xhtml命名空间的XML::LibXML。此后,您可以像使用普通setNodeName对象一样使用该上下文,但您现在可以在元素和属性名称中指定已注册的命名空间。

我不清楚为什么要克隆每个节点。据我所知,您需要做的就是在每个节点上use strict; use warnings; use 5.014; # For non-destructive substitution use XML::LibXML; my $filename = 'xhtml.html'; my $xml = XML::LibXML->new; my $doc = $xml->parse_file($filename); my $xpc = XML::LibXML::XPathContext->new($doc); $xpc->registerNs('xhtml', 'http://www.w3.org/1999/xhtml'); for my $head ('h2' .. 'h6') { my $newhead = $head =~ s/(\d)/$1-1/er; for my $node ($xpc->findnodes("//xhtml:$head")) { $node->setNodeName($newhead); } } print $doc->toString; 。所有必要的是localname:元素将保留其原始名称空间。

这个简短的节目显示了这个想法。

{{1}}