如何使用perl消除xml文件中的标记名称

时间:2011-11-21 12:18:57

标签: xml perl

我在一个文件夹中有多个XML文件,因此我编写了这样的脚本以组合成一个xml文件

#!/usr/bin/perl
use warnings;
use XML::LibXML;
use Carp;
use File::Find;
use File::Spec::Functions qw( canonpath );
use XML::LibXML::Reader;
use Digest::MD5 'md5';

if ( @ARGV == 0 ) {
push @ARGV, "c:/main/work";
warn "Using default path $ARGV[0]\n  Usage: $0  path ...\n";
}

open( my $allxml, '>', "all_xml_contents.combined.xml" )
 or die "can't open output xml file for writing: $!\n";
print $allxml '<?xml version="1.0" encoding="UTF-8"?>',
"\n<Shiporder xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
 my %shipto_md5;
find(
sub {
return unless ( /(_stc\.xml)$/ and -f );
extract_information();
return;
 },
@ARGV
);

print $allxml "</Shiporder>\n";

sub extract_information {
my $path = $_;
 if ( my $reader = XML::LibXML::Reader->new( location => $path )) {
while ( $reader->nextElement( 'data' )) {
    my $elem = $reader->readOuterXml();
    my $md5 = md5( $elem );
    print $allxml $reader->readOuterXml() unless ( $shipto_md5{$md5}++ );
 }
 }
return;
}

它将所有xml文件打印成这样的一个xml。

 all_xml.combined.xml
 <?xml version="1.0" encoding="UTF-8"?>
<student specification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <student>
<name>johan</name>
 </student>

<student>
<name>benny</name>
</student>

 <student>
<name>kent</name>
 </student>

 </student specification>

但我在一个xml文件中还有一个节点信息,我试图在while循环中提取这样的信息。

    $reader->nextElement( 'details' );
     $information = $reader->readInnerXml();

但是如何将此信息添加到输出文件中,请帮我解决这个问题。

3 个答案:

答案 0 :(得分:3)

三个明显的观点。

  1. 您正在加载XML :: LibXML模块,但没有使用它。
  2. 有问题的XML声明始终是输入文件的第一行。那么为什么不跳过第一行?
  3. 您最终得到的文件将不是有效的XML。 XML文档需要单个根元素。因此,您需要创建另一个元素(可能是&lt; students&gt;),围绕其他文件中的所有数据。

答案 1 :(得分:2)

您是否可以切换到XML::Twig?它提供了处理标签的绝佳方式。

可能你需要像

这样的东西
 my $twig=XML::Twig->new(   
    twig_handlers => 
      { 
        **student with specification** => sub { $_->delete;       },  # remove hidden elements
      },

您需要修改具有规范的学生才能为您工作。对不起,我没有太多时间,否则我会写完整的代码。

答案 2 :(得分:0)

以下是使用DOMDocument()

执行此操作的一些代码

总之, 1)从字符串或类似文件创建父文档 2)加载每个文件,导入和追加 3)保存结果。

在XML编程中通常更好的方法是使用XML解析器函数,而不是字符串操作。

祝你好运。

function loadXMLString( $strXML ) {
    $xmlDoc = new DOMDocument();
    $xmlDoc->formatOutput = true; 
    $xmlDoc->loadXML( $strXML );
    return $xmlDoc;
}

function loadXMLFile( $strFileName, $defaultXML=null ) {
    $xmlDoc = new DOMDocument();
    if( file_exists( $strFileName )  ){
        $xmlDoc->load( $strFileName );
    } else {
        if( $defaultXML == null  ) {
            throw new Exception( "Cannot locate file: " . $strFileName . " no default specified." );
        } else {
            // create it, if default XML is supplied
            return $this->loadXMLString( $defaultXML );
        } 
    }
    return $xmlDoc;
}


$xmlMain = loadXMLString( "<xmlparent/>" );

$xmlChild = loadXMLFile( "test1.xml" );
$ndTemp = $xmlMain->importNode( $xmlChild->documentElement, true );
$xmlMain->documentElement->appendChild( $ndTemp );

$xmlChild = loadXMLFile( "test2.xml" );
$ndTemp = $xmlMain->importNode( $xmlChild->documentElement, true );
$xmlMain->documentElement->appendChild( $ndTemp );

$xmlMain->save( "all.xml" );