Perl LIBXML :使用带有属性的 findnode 来访问 xml 文件中的节点



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都将值。

您有三种选择:

  1. 使用双引号,但转义@

    qq(//application[@name="$applicationName"])
    

    qq运算符等效于双引号"…"但可以具有任意分隔符,从而避免了对字符串内的"进行转义的需要。

  2. 连接字符串:

    '//application[@name="' . $applicationName . '"]'
    

    这通常具有难以阅读的趋势。我会避免这个解决方案。

  3. 使用 sprintf 模式从模板生成字符串:

    sprintf '//application[@name="%s"]', $applicationName
    

    如果您还不知道printf模式,可以在 perldoc -f sprintf 中找到它们。

相关内容

  • 没有找到相关文章

最新更新