Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用perl合并两个xml文件_Xml_Perl_Parsing_Merge_Libxml2 - Fatal编程技术网

使用perl合并两个xml文件

使用perl合并两个xml文件,xml,perl,parsing,merge,libxml2,Xml,Perl,Parsing,Merge,Libxml2,我有两个这种类型的xml文件 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Package xmlns="whatever"> <types> <members>test1</members> <name>test2</name> </types> <types>

我有两个这种类型的xml文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="whatever">
    <types>
        <members>test1</members>
        <name>test2</name>
    </types>
    <types>
        <members>test3</members>
        <name>test4</name>
    </types>
    <version>25.0</version>
</Package>

测试1
测试2
测试3
测试4
25


测试5
测试6
25
我想使用perl将这两个函数连接起来以生成结果

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Package xmlns="whatever">
        <types>
            <members>test1</members>
            <name>test2</name>
        </types>
        <types>
            <members>test3</members>
            <name>test4</name>
        </types>
        <types>
            <members>test5</members>
            <name>test6</name>
        </types>
        <version>25.0</version>
    </Package>

测试1
测试2
测试3
测试4
测试5
测试6
25

如何使用Perl做到这一点?

我将从CPAN开始这里有一个使用
XML::LibXML
的解决方案。基本上,它调用
insertBefore
方法将节点从第二个文档复制到第一个文档。根据您的喜好调整脚本,例如,如果在两个包中发现相同的节点,则以不同的方式执行操作

use strict;
use XML::LibXML;

my $xml1 = <<'EOF';
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="whatever">
    <types>
        <members>test1</members>
        <name>test2</name>
    </types>
    <types>
        <members>test3</members>
        <name>test4</name>
    </types>
    <version>25.0</version>
</Package>
EOF

my $xml2 = <<'EOF';
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="whatever">
    <types>
        <members>test5</members>
        <name>test6</name>
    </types>
    <version>25.0</version>
</Package>
EOF

my $doc1 = XML::LibXML->new->parse_string($xml1);
my $doc2 = XML::LibXML->new->parse_string($xml2);

my($version_node) = $doc1->findnodes('//*[local-name()="version"]');
die if !$version_node;

for my $types_node ($doc2->findnodes('//*[local-name()="types"]')) {
    $version_node->parentNode->insertBefore($types_node, $version_node);
}

print $doc1->serialize;
使用严格;
使用XML::LibXML;
我的$xml1=parse_字符串($xml2);
my($version_node)=$doc1->findnodes('//*[local-name()=“version”]');
死吧$版本节点;
对于我的$types_节点($doc2->findnodes('//*[local-name()=“types”]')){
$version\u node->parentNode->insertBefore($types\u node,$version\u node);
}
打印$doc1->序列化;

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。@ajon:URL现在是永久链接。永远不应该变得无效。
use strict;
use XML::LibXML;

my $xml1 = <<'EOF';
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="whatever">
    <types>
        <members>test1</members>
        <name>test2</name>
    </types>
    <types>
        <members>test3</members>
        <name>test4</name>
    </types>
    <version>25.0</version>
</Package>
EOF

my $xml2 = <<'EOF';
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="whatever">
    <types>
        <members>test5</members>
        <name>test6</name>
    </types>
    <version>25.0</version>
</Package>
EOF

my $doc1 = XML::LibXML->new->parse_string($xml1);
my $doc2 = XML::LibXML->new->parse_string($xml2);

my($version_node) = $doc1->findnodes('//*[local-name()="version"]');
die if !$version_node;

for my $types_node ($doc2->findnodes('//*[local-name()="types"]')) {
    $version_node->parentNode->insertBefore($types_node, $version_node);
}

print $doc1->serialize;