user1467735
user1467735

Reputation:

XML to array using PHP but returning errors

I am working with an API and returning XML in the below form and need some expert help:

<?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>[email protected]</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>[email protected]</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>

I am using curl like this

<?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; returns the XML you see above. I'd like to convert it to an array or be able to extract individual values similar to

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

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

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

I get XML Parsing Error: not well-formed and XML Parsing Error: no root element found errors.

Thanks

Upvotes: 0

Views: 33

Answers (1)

hanshenrik
hanshenrik

Reputation: 21503

SimpleXML is an option when you know the input is valid XHTML. If you need to parse broken/non-strict XML/HTML, don't even consider SimpleXml because it will choke. DOMDocument, on the other hand, is much better at parsing not-strictly-valid XHTML. now, the sample input you provided, is actually valid XML, but the error you're referring to, not well-formed and XML Parsing Error: no root element found errors. happens when you try to parse non-strict XHTML with SimpleXml. use DOMDocument instead. for example,

$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";
}

will work on the sample you provided, printing

prefix: Ms.
fname: Mark
email: [email protected]
-
prefix: Ms.
fname: Traci
email: [email protected]
-

while the rough equivalent to your

$movies = new SimpleXMLElement($xmlstr);

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

code would be:

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

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

Upvotes: 1

Related Questions