删除元素后父元素未关闭:XML Twig
我试图找到一个具有特定值属性的元素,并将其从文档中删除 在本例中,我正在寻找一个File元素,该元素具有一个名为“RelativePath”的属性,其值为“…\TS\ETestScenario.inc” 问题:在运行脚本后,最后一个元素-删除元素后父元素未关闭:XML Twig,xml,perl,xml-twig,Xml,Perl,Xml Twig,我试图找到一个具有特定值属性的元素,并将其从文档中删除 在本例中,我正在寻找一个File元素,该元素具有一个名为“RelativePath”的属性,其值为“…\TS\ETestScenario.inc” 问题:在运行脚本后,最后一个元素-丢失。此外,“VisualStudioProject”结束标记打印两次。不知道我在这里干什么 use strict; use XML::Twig; my $fileName = 'Z:\autotest\test.xml'; my $t= new XML::Tw
丢失。此外,“VisualStudioProject”结束标记打印两次。不知道我在这里干什么
use strict;
use XML::Twig;
my $fileName = 'Z:\autotest\test.xml';
my $t= new XML::Twig( TwigRoots=>
{ Files => \&upd_files_section
},
twig_print_outside_roots => 1, # print the rest
keep_spaces => 1,
keep_atts_order=>1,
);
$t->parsefile("$fileName");
#$t->parsefile_inplace ("$fileName");
sub upd_files_section{
my ($t, $inputFields)=@_;
my $file_to_delete = $inputFields->get_xpath("./File[\@att='..\..\TS\ETestScenario.inc']");
$inputFields->delete($file_to_delete);
$t->flush;
}
不正确的XML输出:
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="xxx"
ProjectGUID="{}"
RootNamespace="xx"
SccProjectName="x"
SccLocalPath="."
SccProvider="x"
>
<Files>
<Filter Name="Source Files" Filter="cpp;bat">
<File RelativePath="..\..\TS\ADK_MacCommon_Test.cpp">
</File>
<File RelativePath="..\..\FSO\EADK.cpp">
</File>
<Filter Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" Name="Resource Files">
</Filter>
<File RelativePath="..\..\TS\ETestScenario.inc">
</File>
</VisualStudioProject>
<Globals>
</Globals>
</VisualStudioProject>
如前所述,XML无效,代码无法编译 也就是说,如果我理解正确,我认为处理程序应该是:
sub upd_files_section{
my ($t, $inputFields)=@_;
my @files_to_delete = $inputFields->get_xpath("./File[\@RelativePath='..\\..\\TS\\ETestScenario.inc']");
foreach my $file (@files_to_delete) { $file->delete; }
$t->flush;
}
请注意:
- 您需要转义XPath表达式中的反斜杠,或者Perl认为它们是用来转义以下字符的;或者,在表达式周围使用简单引号或
:q{}
q{./File[@RelativePath='..\..\TS\ETestScenario.inc']}
- 在XPath表达式中,它应该是
,而不是@RelativePath
@att
返回必须删除的元素列表get\u xpath
- 要删除一个元素调用
,不需要像DOM一样遍历它的父元素delete
- 你也可以使用
method:cut_children
$inputFields->cut_children(q{File[@RelativePath='..\..\TS\ETestScenario.inc']})代码>
清除
或将其替换为清除
。您的perl脚本和xml都有错误。如果您等待更好的答案,请修复它们。我已将代码更新到现在编译的位置。XML不正确,这是我的问题。下面mirod的解决方案非常有效。谢谢!!但是,就避免反斜杠而言,我认为我不必这样做,因为字符串在单引号内。它不是!它用双引号引起来。