我正在将 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,但这也不起作用。最后,我查看了文档以查找删除名称空间的方法。没有这样的运气。最终的输出字符串仍然包含我想要删除的所有内容(命名空间声明和前缀)。
有没有人有办法删除命名空间,将元素和属性设置为空命名空间?