получить значение элемента <doc>xml для использования в запросе - PullRequest
0 голосов
/ 06 июля 2018

У меня есть этот код

 $xml = $mbpay->processPaymentInfo();
 Log::info('Showing $mbpay:' . var_export($xml, true));

Журнал показывает как:

[2018-07-06 12:40:56] local.INFO: Showing $mbpay: '<?xml version="1.0" encoding="ISO-8859-1" ?>
<getmb_id>
 <status>ok</status>
<!---->
 <doc>000...</doc>
</getmb_id>'

С помощью этого xml я хочу получить из таблицы notifications значение столбца "r_id", где значение столбца "doc" равно элементу "doc" $xml выше.

Знаете ли вы, как правильно получить значение элемента xml, чтобы можно было выполнить запрос для получения r_id?

Запрос должен быть что-то вроде "$rID = Notifications::where('doc', $doc)->pluck('r_id')->first(); "а как получить $doc?

Последнее обновление:

    $mbpay = new MBPay($payment_info);

    $processed_payment = $mbpay->processPaymentInfo();
    $xml = simplexml_load_string($processed_payment);
    $doc = $xml->doc;

    $rID = DB::table('notifications')->where('doc', $doc)->pluck('r_id')->first();

    Log::info('Showing $mbpay: ' . var_export($xml, true));
    Log::info('doc: ' . var_export($doc, true)); // shows SimpleXMLElement::__set_state(array(
))
    Log::info('rID: ' . var_export($rID, true)); // shows NULL
    Log::info('xml: ' . var_export($xml, true));

    return \Response::make($xml, '200')->header('Content-Type', 'text/xml');

$mbpay->processPaymentInfo() показывает как:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<getmb_key>
     <status>ok</status>
     <message>...</message>
     <user>...</user>
     <doc>...</doc>
</getmb_key>

1 Ответ

0 голосов
/ 06 июля 2018

Предполагая, что вы когда-нибудь ожидаете только один док-узел, есть несколько способов получить значение узла. Первое, что приходит на ум, это simplexml_load_string():

$processed_payment = $mbpay->processPaymentInfo();
$xml = simplexml_load_string($processed_payment);
$doc = (string) $xml->doc;

Мы также можем проанализировать его с помощью loadXML () DOMDocument *) :

$dom = new \DOMDocument();
$dom->loadXML($processed_payment);
$docs = $dom->getElementsByTagName('doc');
$doc = $docs->item(0)->nodeValue;

Как и с SimpleXMLElement ::

$element = new \SimpleXMLElement($processed_payment);
$doc = (string) $element->doc[0];

Наконец, есть старое доброе регулярное выражение с preg_match :

$result = preg_match("/<doc>(.*?)<\\/doc>/", $processed_payment, $matches);
var_dump($matches[1]);

Какой метод вы используете, зависит от структуры вашего документа и, в некоторой степени, от ваших личных предпочтений. Для меня первое, что пришло в голову, было simplexml_load_string(), но после рассмотрения альтернатив и знания ожидаемой структуры, я бы предпочел SimpleXMLElement().

Вот рабочие примеры каждого метода выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...