我正在将XML文档转换为HTML。需要发生的一件事是删除名称空间,这些名称空间不能在HTML中合法声明(除非它是根标记中的XHTML名称空间)。我已经在5-10年前发现了关于XML :: LibXML和LibXML2的难度,但最近并没有这么多。这里有一个例子:使用XML删除XML名称空间:: LibXML
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,并且这也不起作用。最后,我查看了文档中有关删除名称空间的方法。没有这样的运气。最终的输出字符串仍然具有我想要移除的所有内容(名称空间声明和前缀)。
有没有人有办法删除名称空间,将元素和属性设置为空名称空间?
你正试图改变元素的命名空间,但你不迭代元素? – ikegami
@ikegami我会的,但我想先看看它在其中一个上工作。 –