正则表达式替换不匹配的一切

时间:2015-03-13 16:13:43

标签: regex xml perl substitution

示例<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>

3 个答案:

答案 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;检查方法和两个名称的绝对相等性。方法