#php #xml
#php #xml
Вопрос:
Я пытаюсь выяснить, как получить определенное значение из XML
Код :-
function getUrlContent($url,$xml_get_subscriber_info){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_get_subscriber_info);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
//return ($httpcode>=200 amp;amp; $httpcode<300) ? $data : false;
return $data;
$a = simplexml_load_string(getURLContent($url,$xml_get_subscriber_info));
XML :-
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ><SOAP-ENV:Body>
<ns2:root>
<msg_head>
<time>2020-08-20 17:57:29</time>
<from />
<to />
<msg_type />
<serial />
</msg_head>
<interface_msg>
<msg_response>
<ResponseClass Name="Response">
<GetUserClass Name="AJAX">
<ResultCode>0</ResultCode>
<ResultDescr>success</ResultDescr>
<IBAN>1</IBAN>
<PACKAGEID>208$268$269$345$481$482$619$653$656$663$665$702$764$768$1128$1130$1143$1156$1166</PACKAGEID>
<USRSTATUS>1</USRSTATUS>
<PREFERNOTIFYMETHOD>1</PREFERNOTIFYMETHOD>
</GetUserClass>
</ResponseClass>
</msg_response>
</interface_msg>
</ns2:root>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Я пытаюсь получить полезную нагрузку PackageID, но я перепробовал всю сортировку, даже используя loadXML
функцию, но иногда у меня возникают проблемы с синтаксическим анализатором при использовании loadXML
из-за высокой нагрузки, но теперь я решил перейти на simple_load_xml
.
Я попробовал следующий метод :-
print_r($xml->children("SOAP-ENV", true)->children("ns2", true));
Даже пытался использовать его как пространство имен, безуспешно
$xml = simplexml_load_string($result,"SimpleXMLElement", 0, "SOAP-ENV", true);
Ответ №1:
Используя DOMDocument()
вместо:
<?php
$doc = new DOMDocument();
$doc->loadXML($your_file_as_string);
$xpath = new DOMXPath($doc);
foreach ($xpath->query("//PACKAGEID/text()") as $package) {
print_r($package->textContent);
}
?>
Это дает
208$268$269$345$481$482$619$653$656$663$665$702$764$768$1128$1130$1143$1156$1166
Комментарии:
1. Спасибо @Jan за отзыв, вместо файла в виде строки можно использовать ответ curl?
2. Кроме того, это похоже на то, что я сделал . $result_provisioning = $resu< $ doc = новый DOMDocument ( ‘1.0’, ‘utf-8’); $doc-> loadXML ($result_provisioning); $resultCode = $doc-> getElementsByTagName (‘PackageID’)->item(0)-> nodeValue; Но мой использует getElementByTagName, и я столкнусь с проблемой синтаксического анализатора, когда скорость передачи данных превысит 50
3. @FreedomPride: Вы не указали этот код в своем вопросе. И да, ответ curl можно использовать, если он является строкой.
4. Из-за проблемы мне пришлось использовать следующий кодовый метод, но я пробую ваш код.. После 50 tps я наблюдаю прерывистую ошибку: DOMDocument::loadXML(): Пустая строка, предоставленная в качестве входных данных в test.php