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

如何使用perl消除xml文件中的标记名,xml,perl,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

我在一个文件夹中有多个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;
}

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

您是否可以切换到?它提供了处理标签的极好方法

也许你需要像这样的东西

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

您需要使用规范修改学员,以便为您工作。抱歉,我没有太多时间,否则我会编写完整的代码。

您是否可以切换到?它提供了处理标签的极好方法

也许你需要像这样的东西

 my $twig=XML::Twig->new(   
    twig_handlers => 
      { 
        **student with specification** => sub { $_->delete;       },  # remove hidden elements
      },
您需要使用规范修改学员,以便为您工作。对不起,我没有太多时间,否则我会写完整的代码。

三个明显的要点

  • 您正在加载XML::LibXML模块,但没有使用它
  • 有问题的XML声明总是输入文件的第一行。那么为什么不跳过第一行呢
  • 最终生成的文件将不是有效的XML。XML文档需要一个根元素。因此,您需要创建另一个元素(可能)来包围来自其他文件的所有数据
  • 三点显而易见

  • 您正在加载XML::LibXML模块,但没有使用它
  • 有问题的XML声明总是输入文件的第一行。那么为什么不跳过第一行呢
  • 最终生成的文件将不是有效的XML。XML文档需要一个根元素。因此,您需要创建另一个元素(可能)来包围来自其他文件的所有数据

  • 下面是一些使用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" );
    
    函数loadXMLString($strXML){
    $xmlDoc=新的DOMDocument();
    $xmlDoc->formatOutput=true;
    $xmlDoc->loadXML($strXML);
    返回$xmlDoc;
    }
    函数loadXMLFile($strFileName,$defaultXML=null){
    $xmlDoc=新的DOMDocument();
    如果(文件_存在($strFileName)){
    $xmlDoc->load($strFileName);
    }否则{
    如果($defaultXML==null){
    抛出新异常(“找不到文件:”.$strFileName。“未指定默认值”);
    }否则{
    //如果提供了默认XML,则创建它
    返回$this->loadXMLString($defaultXML);
    } 
    }
    返回$xmlDoc;
    }
    $xmlMain=loadXMLString(“”);
    $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”);
    
    下面是一些使用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" );
    
    函数loadXMLString($strXML){
    $xmlDoc=新的DOMDocument();
    $xmlDoc->formatOutput=true;
    $xmlDoc->loadXML($strXML);
    返回$xmlDoc;
    }
    函数loadXMLFile($strFileName,$defaultXML=null){
    $xmlDoc=新的DOMDocument();
    如果(文件_存在($strFileName)){
    $xmlDoc->load($strFileName);
    }否则{
    如果($defaultXML==null){
    抛出新异常(“找不到文件:”.$strFileName。“未指定默认值”);
    }否则{
    //如果提供了默认XML,则创建它
    返回$this->loadXMLString($defaultXML);
    } 
    }
    返回$xmlDoc;
    }
    $xmlMain=loadXMLString(“”);
    $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”);
    
    这是同一个问题,这是同一个问题,因为我对perl语言非常陌生,在经过了一些建议之后,我通过XML::LibXML编写了这样的代码,这对我来说花了很多时间,每件事都在起作用,你只知道问题所在。如果现在我想转换到XML::Twig,那么我需要更多的时间,我需要修改整个代码,你能帮我解决这个问题吗?我对perl语言非常陌生,在一些建议之后,我浏览了XML::LibXML,我这样写,这对我来说需要很多时间,每件事都在工作,你只知道问题所在。如果现在我想转换到XML::Twig,那么我需要更多的时间,我需要修改整个代码,你能帮我解决这个问题吗?我不明白你说的是什么,你能帮我解决这个问题吗?我不知道如何才能说得更清楚。你不明白什么?我消除了我的问题,现在我正在生成一个新的xml文件,下面有一个标记名,我正在存储所有xml文件。我修改了我的脚本,看看我的新脚本,但是在这个问题上,我还有一个问题,你能帮我解决吗?我不明白你说的是什么,你能帮我解决这个问题吗?我不知道我怎样才能说得更清楚。你不明白什么?我消除了我的问题,现在我正在生成一个新的xml文件,下面有一个标记名,我正在存储所有的xml文件。我修改了我的脚本,看看我的新脚本,但在这方面我还有一个问题,你能帮我解决吗?你使用了哪个模块,我不能很好地理解你的概念,你能给我更详细的解释吗。