我正在使用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);
}
}
答案 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}}