У меня есть код ниже, который извлекает имя исполнителя из 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);