XML 文件如下所示:
<?xml version="1.0"?>
<application name="pos">
<artifact id="123" type="war" cycle="Release7-Sprint1">
<jira/>
<jenkins/>
<deployment/>
<scm>
<transaction id="1234" user="">
<file name=""/>
<file name=""/>
</transaction>
</scm>
</artifact>
</application>
我的代码段如下所示,当我使用属性(名称)的硬编码值而不是使用变量时,工作正常。我正在引用该行(我的$query=
'//application[@name="pos"]';)
my $manifestDoc = $manifestFileParser->parse_file($manifestFile);
my $changeLogDoc = $changeLogParser->parse_file($changeLogXml );
my $changeLogRoot = $changeLogDoc->getDocumentElement;
#my $applicationName = pos;
my $query = '//application[@name="pos"]';
my $applicationNode = $manifestDoc->findnodes($query);
my $artifactNode = $manifestDoc->createElement('artifact');
$artifactNode->setAttribute("id",$artifactID);
$artifactNode->setAttribute("type",$artifactType);
$artifactNode->setAttribute("cycle",$releaseCycle);
$applicationNode->[0]->appendChild($artifactNode);
但是,如果我修改$query变量以使用变量 ($applicationName) 而不是属性的硬编码值,它会给我一个编译错误,如下所示:
无法在 updateManifest.pl 行的未定义值上调用方法 "appendChild"
修改后的代码:
my $applicationName = "pos" ;
my $query = '//application[@name="$applicationName"]';
不知道出了什么问题。与报价有关吗?任何帮助都非常感谢。
表达式 '//application[@name="$applicationName"]'
表示具有这些内容的文字字符串 – 没有变量用单引号插值。如果使用双引号,则@name
和$applicationName
都将值。
您有三种选择:
-
使用双引号,但转义
@
:qq(//application[@name="$applicationName"])
qq
运算符等效于双引号"…"
但可以具有任意分隔符,从而避免了对字符串内的"
进行转义的需要。 -
连接字符串:
'//application[@name="' . $applicationName . '"]'
这通常具有难以阅读的趋势。我会避免这个解决方案。
-
使用
sprintf
模式从模板生成字符串:sprintf '//application[@name="%s"]', $applicationName
如果您还不知道
printf
模式,可以在perldoc -f sprintf
中找到它们。