示例<AAA:BBB CCC:DDD EEE:FFF><GGG:HHH III:JJJ><KKK>
我想要的是一个删除<BBB><HHH><KKK>
以外的所有内容的替代品
我已经尝试过很多东西而且一直在摔倒
如果它一次更容易一个支撑,那将是好的
正如您可以使用LibXML猜测它的XML并且我正在针对数组中的路径和节点列表解析所有元素。我只是希望节点名称不像
<com.fnf:NodeName/>
需要<NodeName/>
或者更糟糕的是<\com.com.com:NodeName xmlns:com.com.com="http://www.some.domain">
只需说<NodeName>
答案 0 :(得分:1)
我认为这个简短的计划将满足您的需求。它使用XML::Twig
来处理XML数据,并定义一个为数据中的所有元素调用的twig处理程序,并删除元素的名称空间前缀和所有属性。
我必须猜测您的XML数据的真实情况,因为您在问题中显示的内容远非有效的XML。
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new;
$twig->setTwigHandler(_all_ => sub {
$_->set_name($_->local_name);
$_->del_atts;
});
$twig->parse( \*DATA );
$twig->print(pretty_print => 'indented');
__DATA__
<root>
<aaa:bbb ccc="ddd" eee="fff">
<ggg:hhh iii="jjj">
<kkk></kkk>
</ggg:hhh>
</aaa:bbb>
</root>
<强>输出强>
<root>
<bbb>
<hhh>
<kkk></kkk>
</hhh>
</bbb>
</root>
答案 1 :(得分:0)
一个想法:这可以通过xsl转换完成:
xsl文件:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/>
<!-- template for all elements -->
<xsl:template match="*">
<!-- local-name() gets the tagname without namespace -->
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
<!-- template to copy all that is not a tag or an attribute -->
<xsl:template match="comment() | text() | processing-instruction()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
perl代码:
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXSLT;
use XML::LibXML;
my $xslt = XML::LibXSLT->new();
my $source = XML::LibXML->load_xml(location => 'removens.xml');
my $style_doc = XML::LibXML->load_xml(location => 'removens.xsl');
my $stylesheet = $xslt->parse_stylesheet($style_doc);
my $results = $stylesheet->transform($source);
print $stylesheet->output_as_bytes($results);
或者代替使用perl,您可以在终端中直接使用xsltproc:
xsltproc removens.xsl removens.xml
答案 2 :(得分:0)
使用XML::Parser并将Namespaces
设置为true:
命名空间
这是一个Expat选项。如果将其设置为true值,则在解析期间完成名称空间处理。请参阅&#34;命名空间&#34;在XML :: Parser :: Expat中进一步讨论命名空间处理。
...
如果给出此选项的值为true,则解析器会进行命名空间处理。默认情况下,命名空间处理已关闭。当它打开时,解析器使用xmlns属性并从元素和属性名称中去除前缀,其中这些前缀具有已定义的名称空间。可以使用&#34;命名空间&#34;找到名称的命名空间。可以使用&#34; eq_name&#34;检查方法和两个名称的绝对相等性。方法