2014-02-19 97 views
1

一个节点的XML文件看起来像如下:的Perl的libxml:使用findnodes与属性,达到在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> 

我的代码块下面看上去,当我使用属性的硬编码值工作正常(名称),而不是使用变量。我引用线(我的$查询=
'//应用[@名称= “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); 

但是如果我修改$查询变量使用一个变量($的applicationName)而不是属性的硬编码值,它给了我一个编译错误下面说:

在updateManifest.pl线无法调用“的appendChild”未定义的值

修改后的代码:

my $applicationName = "pos" ; 
my $query = '//application[@name="$applicationName"]'; 

不知道什么是错的。任何与报价有关的事情? 任何帮助,非常感谢。

回答

1

表达'//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记录。

+0

非常感谢。我已经使用了选项1,它工作。 – user1470220

+1

XPath也支持单引号。所以我通常会使用''// application [\ @ name ='$ applicationName']“'。 – nwellnhof

相关问题