【问题标题】:Merge two xml files using perl使用perl合并两个xml文件
【发布时间】:2013-09-19 14:41:03
【问题描述】:

我有两个 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>

<?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>

我想用 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>

如何使用 Perl 做到这一点?

【问题讨论】:

    标签: xml perl parsing merge libxml2


    【解决方案1】:

    这是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;
    

    【讨论】:

      【解决方案2】:

      我将从 CPAN 的 XML::Merge 开始

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      • @ajon:URL 现在是永久链接。永远不会失效。
      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 2011-06-23
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      相关资源
      最近更新 更多