Синтаксический анализ PHP XML для извлечения определенного значения

#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