4

这是一个基本的 XML 文档示例

<book_reviewers>
    <results>
        <reviewer>
            <name>Anne</name>
            <profession>Catfish wrangler</profession>
        </reviewer>
        <reviewer>
            <name>Bob</name>
            <profession>Beer taster</profession>
        </reviewer>
        <reviewer>
            <name>Charlie</name>
            <profession>Gardener</profession>
        </reviewer>
    </results>
</book_reviewers>

我想补充一点:

<reviewer>
    <name>Joan</name>
    <profession>Jett</profession>
 </reviewer>

我尝试了许多解决方案的组合,这是一个至少不会引发错误的解决方案,但它也不起作用。

#!/usr/bin/perl
use XML::LibXML;
use strict;

my $filename = "cr.xml";

my $parser = XML::LibXML->new();
my $critic_details = $parser->parse_file("$filename") or die;
my $new_reviewer = $critic_details->documentElement;
my $reviewer_name = $critic_details->documentElement;
my $reviewer_prof = $critic_details->documentElement;
my $newnode = $critic_details->documentElement;

 for my $reviewers($critic_details->findnodes("book_reviewers/results/reviewers")){
     $new_reviewer = $reviewers->createElement("reviewer");
    $reviewer_name = $new_reviewer->addChild("name");
    $reviewer_name->appendText("Joan");
    $reviewer_prof = $new_reviewer->addChild("profession");
    $reviewer_prof->appendText("Jett");
    $newnode = $reviewers->addSibling($new_reviewer); #also tried addChild

}
print $critic_details->toString;

我得到的输出是:

<?xml version="1.0"?>
<book_reviewers>
        <results>
                <reviewer>
                        <name>Anne</name>
                        <profession>Catfish wrangler</profession>
                </reviewer>
                <reviewer>
                        <name>Bob</name>
                        <profession>Beer taster</profession>
                </reviewer>
                <reviewer>
                        <name>Charlie</name>
                        <profession>Gardener</profession>
                </reviewer>
        </results>
</book_reviewers>

这只是原始数据

非常感谢任何帮助 - 我对 Perl 和 XML Cheers 都很陌生

4

3 回答 3

4

有很多方法可以做到这一点

这种方式分别创建节点并将其放在一起。它还没有准备好生产,因为它假设有一个部分

#!/usr/bin/perl
use XML::LibXML;
use strict;

my $filename = "cr.xml";

my $parser = XML::LibXML->new();
my $critic_details = $parser->parse_file("$filename") or die;

my $reviewer  = $critic_details->findnodes("book_reviewers/results")->[0];

my $node = XML::LibXML::Element->new("reviewer");

my $p = XML::LibXML::Element->new("profession");
my $pn = XML::LibXML::Text->new("Jett");
$p->addChild($pn);

my $n = XML::LibXML::Element->new("name");
my $nn = XML::LibXML::Text->new("Joan");
$n->addChild($nn);

$node->addChild($p);
$node->addChild($n);

$reviewer->addChild($node);

print $critic_details->toString;

这给出了这个

<?xml version="1.0"?>
<book_reviewers>
    <results>
        <reviewer>
            <name>Anne</name>
            <profession>Catfish wrangler</profession>
        </reviewer>
        <reviewer>
            <name>Bob</name>
            <profession>Beer taster</profession>
        </reviewer>
        <reviewer>
            <name>Charlie</name>
            <profession>Gardener</profession>
        </reviewer>
    <reviewer><profession>Jett</profession><name>Joan</name></reviewer></results>
</book_reviewers>
于 2014-05-18T10:57:03.890 回答
3
于 2014-05-18T12:36:39.890 回答
1

可以使用XML::LibXML本质上将节点从一个 XML 文档导入到另一个 XML 文档中。这很有用,因为您不必显式使用对象构建新数据,而只需使用标准 XML 表示法即可。

下面演示了这一点。通过在新文档中设置一个根节点然后迭代找到的节点而不是只选择第一个节点,这可以很容易地扩展到一个重要的多个新审阅者。

#!/usr/bin/perl

use strict;
use warnings;

use XML::LibXML;

my $dom = XML::LibXML->load_xml(IO => \*DATA);

my $newnode = XML::LibXML->load_xml(string => <<'END_STRING')->findnodes('//*')->[0];
<reviewer>
    <name>Joan</name>
    <profession>Jett</profession>
</reviewer>
END_STRING

$dom->findnodes("book_reviewers/results")->[0]->addChild($newnode);

print $dom->toString;

__DATA__
<book_reviewers>
    <results>
        <reviewer>
            <name>Anne</name>
            <profession>Catfish wrangler</profession>
        </reviewer>
        <reviewer>
            <name>Bob</name>
            <profession>Beer taster</profession>
        </reviewer>
        <reviewer>
            <name>Charlie</name>
            <profession>Gardener</profession>
        </reviewer>
    </results>
</book_reviewers>

输出:

<?xml version="1.0"?>
<book_reviewers>
    <results>
        <reviewer>
            <name>Anne</name>
            <profession>Catfish wrangler</profession>
        </reviewer>
        <reviewer>
            <name>Bob</name>
            <profession>Beer taster</profession>
        </reviewer>
        <reviewer>
            <name>Charlie</name>
            <profession>Gardener</profession>
        </reviewer>
    <reviewer>
    <name>Joan</name>
    <profession>Jett</profession>
</reviewer></results>
</book_reviewers>
于 2014-05-19T03:43:33.317 回答