Всем привет!
Это не другой вопрос CDATA с LIBXML_NOCDATA, у меня действительно проблема с источником моих cURL (мульти) запросов. Если XML, отправленный API, содержит CDATA, то скручивание прекращается, и из CDATA до конца ничего не извлекается. Это означает, что LIBXML_NOCDATA бесполезен, так как в полученном результате нет CDATA.
$endpoint = 'http://theapiservice.com?sentence=';
$urls = array();
foreach( $sentences as $key => $value ) {
$urls[] = $endpoint . $value;
}
$multi = curl_multi_init();
$channels = array();
$results = array();
// Loop through the URLs, create curl-handles
// and attach the handles to our multi-request
foreach ( $urls as $url ) {
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_HEADER, false );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_multi_add_handle( $multi, $ch );
$channels[$url] = $ch;
}
// While we're still active, execute curl
$active = null;
do {
$mrc = curl_multi_exec( $multi, $active );
} while ( $mrc == CURLM_CALL_MULTI_PERFORM );
while ( $active && $mrc == CURLM_OK ) {
// Wait for activity on any curl-connection
if ( curl_multi_select( $multi ) == -1 ) {
continue;
}
// Continue to exec until curl is ready to
// give us more data
do {
$mrc = curl_multi_exec( $multi, $active );
} while ( $mrc == CURLM_CALL_MULTI_PERFORM );
}
// Loop through the channels and retrieve the received
// content, then remove the handle from the multi-handle
foreach ( $channels as $channel ) {
$results[] = curl_multi_getcontent( $channel );
curl_multi_remove_handle( $multi, $channel );
}
// Close the multi-handle and return our results
curl_multi_close( $multi );
И вот XML из API, который должен быть получен. Есть CDATA, что означает, что я получу только то, что было до, а не после. И это единственная часть, где также есть разрывы строк.
<Word>
<Surface>DATA1</Surface>
<Sub>DATA1_Sub</Sub>
</Word>
<Word>
<Surface>)</Surface>
</Word>
<Word>
<Surface>
<![CDATA[ ]]>
</Surface>
</Word>
<Word>
<Surface>DATA2</Surface>
<Sub>DATA2_Sub</Sub>
</Word>
Что я получаю (вы можете видеть, что ничего не извлекается из CDATA):
[23] => SimpleXMLElement Object ( [Surface] => DATA1 [Sub] => DATA1_Sub ) [24] => SimpleXMLElement Object ( [Surface] => ) ) ) ) ) )
Когда запрос верен и CDATA не отправляется обратно, тогда все идеально, и я могу нормально анализировать XML. Есть ли у вас какие-либо идеи о том, как мне сделать, чтобы получить как минимум 100% XML, а не только часть перед CDATA?
Спасибо
Задача ещё не решена.
Других решений пока нет …