У меня есть код ниже, который извлекает имя исполнителя из XML файла с кодом ref asrist.
<?php
$dom = new DOMDocument();
$dom->load('http://www.bookingassist.ro/test.xml');
$xpath = new DOMXPath($dom);
echo $xpath->evaluate('string(//Artist[ArtistCode = "COD Artist"] /ArtistName)');
?>
Код, который вытягивает код исполнителя на основе поиска
<?php echo $Artist->artistCode ?>
Мой вопрос: могу ли я вставить переменную, сгенерированную PHP-кодом, в строку запроса xml? Если бы вы могли бы посоветовать, где я начну читать...
благодаря
Вы имеете в виду выражение XPath. Да, вы можете - это "просто строка".
$expression = 'string(//Artist[ArtistCode = "'.$Artist->artistCode.'"]/ArtistName)'
echo $xpath->evaluate($expression);
Но вы должны убедиться, что результат действителен XPath, и ваше значение не прерывает строковый литерал. Некоторое время назад я написал функцию для библиотеки, которая готовит строку таким образом.
Проблема в XPath 1.0 заключается в том, что здесь нет способа избежать какого-либо специального символа. Если строка содержит кавычки, которые вы используете в XPath, это нарушает выражение. Функция использует кавычки, не используемые в строке, или, если они используются, разделяет строку и помещает части в вызов concat()
.
public function quoteXPathLiteral($string) {
$string = str_replace("\x00", '', $string);
$hasSingleQuote = FALSE !== strpos($string, "'");
if ($hasSingleQuote) {
$hasDoubleQuote = FALSE !== strpos($string, '"');
if ($hasDoubleQuote) {
$result = '';
preg_match_all('("[^\']*|[^"]+)', $string, $matches);
foreach ($matches[0] as $part) {
$quoteChar = (substr($part, 0, 1) == '"') ? "'" : '"';
$result .= ", ".$quoteChar.$part.$quoteChar;
}
return 'concat('.substr($result, 2).')';
} else {
return '"'.$string.'"';
}
} else {
return "'".$string."'";
}
}
Функция генерирует необходимый XPath.
$expression = 'string(//Artist[ArtistCode = '.quoteXPathLiteral($Artist->artistCode).']/ArtistName)'
echo $xpath->evaluate($expression);