我正在将一个XML文档转换为HTML。其中需要进行的一个操作是去除命名空间,在HTML中不能合法地声明命名空间(除非是在根标签中使用XHTML命名空间)。我发现5-10年前有关于如何使用XML::LibXML和LibXML2解决这个问题的帖子,但最近没有那么多了。以下是一个例子:
use XML::LibXML;
use XML::LibXML::XPathContext;
use feature 'say';
my $xml = <<'__EOI__';
<myDoc>
<par xmlns:bar="www.bar.com">
<bar:foo/>
</par>
</myDoc>
__EOI__
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($xml);
my $bar_foo = do{
my $xpc = XML::LibXML::XPathContext->new($doc);
$xpc->registerNs('bar', 'www.bar.com');
${ $xpc->findnodes('//bar:foo') }[0];
};
$bar_foo->setNodeName('foo');
$bar_foo->setNamespace('','');
say $bar_foo->nodeName; #prints 'bar:foo'. Dang!
my @namespaces = $doc->findnodes('//namespace::*');
for my $ns (@namespaces){
# $ns->delete; #can't find any such method for namespaces
}
say $doc->toStringHTML;
在这段代码中,我尝试了一些行不通的方法。首先,我试图将
bar:foo
元素的名称设置为未加前缀的foo
(文档说该方法能识别命名空间,但显然不行)。然后我试图将元素的命名空间设置为null,但也没用。最后,我查看文档以寻找删除命名空间的方法,但没有发现。最终输出的字符串仍包含我想要删除的内容(命名空间声明和前缀)。有人知道如何移除命名空间并将元素和属性设置为null命名空间吗?