XML到数组使用PHP但返回错误

时间:2018-05-04 16:47:26

标签: arrays xml curl

我正在使用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>

我正在使用像这样的卷曲

<?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 :(得分:1)

当您知道输入是有效的XHTML时,SimpleXML是一个选项。如果你需要解析破碎/非严格的XML / HTML,甚至不要考虑SimpleXml,因为它会阻塞。另一方面,DOMDocument在解析非严格有效的XHTML方面要好得多。现在,您提供的示例输入实际上是有效的XML,但是当您尝试使用SimpleXml解析非严格的XHTML时,会发生您所指的错误not well-formed and XML Parsing Error: no root element found errors.。请改用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;