使用perl XML :: LibXML将数据附加到XML文件

时间:2016-01-19 19:30:18

标签: xml perl libxml2

我有一个创建XML文件的脚本。我需要修改它,以便它打开文件,转到<reports>标记,然后找到相应的<host name="$myName">部分并替换它,或添加新的<host name="$myName">标记。到目前为止,我所尝试的一切都无法正常工作。

以下是我遇到的问题:  问题#1 如何检查工作站是否已在报告中,如果是,则替换该元素?  问题#2 附加文件中的主机条目都被塞入1行,而不是整齐地分解。所以,而不是得到这个:

输入:

<reports>
  <host name="Workstation01">
    ....
  </host>
</reports>

期望的输出:

<reports>
  <host name="Workstation01">
    ....
  </host>
  <host name="Workstation02">
    ....
  </host>
</reports>

我明白了:

<reports>
  <host name="Workstation01">
    ....
  </host><host name="Workstation02">....</host><host name="Workstation02">....</host></reports>

我正在尝试创建一个新的XML对象,读入XML文件,$ report = $ root-&gt; findnodes(“/ reports”),然后执行$ report-&gt; appendChild($ host),但是没有任何牵引力。

use XML::LibXML;

my $saveFile = "reports/test.xml";

my $XML = XML::LibXML::Document->new('1.0', 'utf-8');
my $report = $XML->createElement('reports');

my $host = $XML->createElement('host');
$host->setAttribute('name', 'Workstation02');

# Create a new XML object to store the file so we can modify it
my $XML2 = XML::LibXML->new;
my $file = $XML2->parse_file($saveFile);
my $root = $file->getDocumentElement();
my @nodes = $root->findnodes("/reports");

$report = $nodes[0];
$report->addChild($host);

$file->setDocumentElement($report);
print $file->toString(1);

保存新文件部分有效,但我无法弄清楚为什么追加部分不起作用。

问题#1,搜索并替换元素

我很难让它正常工作,因为它总是对文件做了奇怪的事情。所以,我的解决方法是清除所有childNodes,添加新主机,然后使用perl擦除我们清除的空白条目。

foreach my $element ( $root->findnodes('/reports/host[@name="Workstation02"]'))
{
  $element->removeChildNodes();
}

然后在结束时我刚用perl搜索<name="Workstation02"/>并在保存之前删除了该行。

问题#2,文件现在输出正确的XML

my $file = $XML->load_xml(location => $saveFile, { no_blanks => 1 });

0 个答案:

没有答案