XML для массива с использованием PHP, но возвращает ошибки - PullRequest
0 голосов
/ 04 мая 2018

Я работаю с API и возвращаю XML в приведенной ниже форме, и мне нужна помощь специалиста:

<?xml version="1.0" encoding="UTF-8"?>
<Data xmlns="http://www.apilink.com/schema/data" xmlns:dmd="http://www.apiurl.com/schema/data-metadata" dmd:date="2018-05-04">
<Record userId="12323" username="mabbott" termId="809" dmd:surveyId="2153479">
    <dmd:IndexEntry indexKey="DEPARTMENT" entryKey="Accountancy" text="Accountancy"/>
    <PCI id="4354343" dmd:lastModified="2018-05-04T09:46:52">
        <PREFIX>Ms.</PREFIX>
        <FNAME>Mark</FNAME>
        <PFNAME/>
        <MNAME>Marie</MNAME>
        <LNAME>Abbotto</LNAME>
        <SUFFIX/>
        <ALT_NAME/>
        <ENDPOS/>
        <EMAIL>mabbotto@site.net</EMAIL>
        <BUILDING>Car Center</BUILDING>
        <ROOMNUM>280</ROOMNUM>
        <OPHONE1>232</OPHONE1>
        <OPHONE2>212</OPHONE2>
        <OPHONE3>2323</OPHONE3>
        <DPHONE1/>
        <DPHONE2/>
        <DPHONE3/>
        <FAX1/>
        <FAX2/>
        <FAX3/>
        <PCI_WEBSITE id="435435">
            <WEBSITE/>
        </PCI_WEBSITE>
        <BIO/>
        <TEACHING_INTERESTS/>
        <RESEARCH_INTERESTS/>
        <CONSULT_INTEREST/>
        <UPLOAD_PHOTO/>
    </PCI>
</Record>
<Record userId="435335435" username="jdoe" termId="809" dmd:surveyId="3244354335">
    <dmd:IndexEntry indexKey="DEPARTMENT" entryKey="words and stuff" text="stuff"/>
    <PCI id="546546546" dmd:lastModified="2018-05-04T09:46:53">
        <PREFIX>Ms.</PREFIX>
        <FNAME>Traci</FNAME>
        <PFNAME/>
        <MNAME>B</MNAME>
        <LNAME>Lee</LNAME>
        <SUFFIX/>
        <ALT_NAME/>
        <ENDPOS/>
        <EMAIL>jdoe@mysite.com</EMAIL>
        <BUILDING>101 Academic Center</BUILDING>
        <ROOMNUM>232</ROOMNUM>
        <OPHONE1>121</OPHONE1>
        <OPHONE2>891</OPHONE2>
        <OPHONE3>0000</OPHONE3>
        <DPHONE1/>
        <DPHONE2/>
        <DPHONE3/>
        <FAX1/>
        <FAX2/>
        <FAX3/>
        <PCI_WEBSITE id="22209488897">
            <WEBSITE/>
        </PCI_WEBSITE>
        <BIO>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nec volutpat tellus. Suspendisse elementum faucibus laoreet. Donec blandit enim non tincidunt lacinia. Etiam imperdiet leo at lorem pretium, at aliquet dui porttitor. Vestibulum egestas dictum accumsan. Morbi ullamcorper libero sit amet diam sodales volutpat. Mauris eu ligula vitae erat lacinia consectetur sit amet vitae ligula. Phasellus feugiat scelerisque vulputate. Fusce commodo velit a augue pellentesque interdum. Sed eleifend dignissim quam gravida congue. Ut a ullamcorper sapien, eget accumsan purus. Nam ultricies suscipit lacus, quis posuere metus sodales a. Integer sodales sodales massa in ornare. Vivamus semper lacus non nibh faucibus efficitur. </BIO>
        <TEACHING_INTERESTS>Phasellus feugiat</TEACHING_INTERESTS>
        <RESEARCH_INTERESTS>Phasellus feugiat</RESEARCH_INTERESTS>
        <CONSULT_INTEREST/>
        <UPLOAD_PHOTO>folder/1.png</UPLOAD_PHOTO>
    </PCI>
</Record>
</Data>

Я использую curl вот так

<?php

header('Content-Type: text/xml');
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.info',
    CURLOPT_USERPWD => "user",
    CURLOPT_ENCODING => 'pass',
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_RETURNTRANSFER => true));

$responseData = curl_exec($curl);

if(curl_errno($curl))
{
    $errorMessage = curl_error($curl);
    // TODO: Handle cURL error
}
else
{
    $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
    // TODO: Handle HTTP status code and response data
    print $responseData;
}

curl_close($curl);
?> 

print $responseData; возвращает XML, который вы видите выше. Я хотел бы преобразовать его в массив или иметь возможность извлекать отдельные значения, подобные

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo $movies->movie[0]->plot;
?>

в http://php.net/manual/en/simplexml.examples-basic.php

Я получаю ошибку синтаксического анализа XML: неправильно сформирован и Ошибка синтаксического анализа XML: ошибки корневого элемента не найдены.

Спасибо

1 Ответ

0 голосов
/ 05 мая 2018

SimpleXML - это опция, когда вы знаете, что ввод действительный XHTML. Если вам нужно разобрать сломанный / нестрогий XML / HTML, даже не рассматривайте SimpleXml, потому что он захлебнется. DOMDocument, с другой стороны, намного лучше разбирает не совсем корректный XHTML. Теперь предоставленный вами пример ввода на самом деле является допустимым XML, но ошибка, на которую вы ссылаетесь, not well-formed and XML Parsing Error: no root element found errors. возникает, когда вы пытаетесь проанализировать нестрогий XHTML с SimpleXml. вместо этого используйте DOMDocument. например,

$domd = @DOMDocument::loadHTML ( $xml );
$xp = new DOMXPath ( $domd );
foreach ( $domd->getElementsByTagName ( "record" ) as $record ) {
    $interesting = $xp->query ( './/prefix|.//fname|.//email', $record );
    foreach ( $interesting as $ele ) {
        echo "{$ele->nodeName}: {$ele->textContent}\n";
    }
    echo "-\n";
}

будет работать с предоставленным вами образцом, печатая

prefix: Ms.
fname: Mark
email: mabbotto@site.net
-
prefix: Ms.
fname: Traci
email: jdoe@mysite.com
-

в то время как грубый эквивалент вашего

$movies = new SimpleXMLElement($xmlstr);

echo $movies->movie[0]->plot;

код будет:

$movies=@DOMDocument::loadHTML($xmlstr);

echo $movies->getElementsByTagName("movie")->item(0)->getElementsByTagName("plot")->item(0)->textContent;
...