我有一个创建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 });