файл 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>
Моего кусок кода выглядит ниже и хорошо работает, когда я использую жесткий кодированное значение атрибута (name) вместо использования переменной. Я ссылки на строку (мой $ запрос =
'// приложение [@ имя = "позиция"];)
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) вместо жестко закодированного значения атрибута, он дает мне ошибку компиляции говоря ниже:
Невозможно вызвать метод «AppendChild» на неопределенное значение в updateManifest.pl линии
Модифицированный код:
my $applicationName = "pos" ;
my $query = '//application[@name="$applicationName"]';
Не уверен, что не так. Что-нибудь делать с цитатами? Любая помощь очень ценится.
Большое спасибо. Я использовал вариант 1, и он сработал. – user1470220
XPath также поддерживает одинарные кавычки. Поэтому я обычно иду с '// // application [\ @ name = '$ applicationName']". – nwellnhof