Переменная Php в строку запроса XML

0

У меня есть код ниже, который извлекает имя исполнителя из 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? Если бы вы могли бы посоветовать, где я начну читать...

благодаря

Показать ещё 1 комментарий
Теги:
string
variables

1 ответ

1

Вы имеете в виду выражение 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню