使用PHP SimpleXML从内部节点获取XML属性失败

时间:2014-12-04 06:53:06

标签: php xml simplexml

CHAPS, 我正在尝试获取'文件的属性。使用SimpleXml的以下XML中的节点,但每次都返回null。我已经成功获得了研究节点的属性但未能获得'文件' atts。

这是xml:

<?xml version="1.0" encoding="UTF-8"?>
<studies>
  <study uid="1.3.12.2" acc="181">
    <date>20051218</date>
    <time>2156</time>
    <ref>CG</ref>
    <desc>Abdomen</desc>
    <id></id>
    <path>S00001</path>
    <modality>CR</modality>
    <reports>
  <file cat="UNK" date="20141124">Card_Cloud.txt</file>
</reports>
</study>

这是我的代码:

$studyXML = new SimpleXMLElement($studyXML);
$studyXML_array = array();
foreach ($studyXML ->study as $study)
{

// Getting uid and accession from XML attributes
$uid = (!empty($study)) ? (String)$study->attributes()->uid : '';
$acc = (!empty($study)) ? (String)$study->attributes()->acc : '';



// Getting the reports and putting them in an array
$reports = array ();
foreach($study->reports as $rep)
{
  $cat = (String)$rep->attributes()->cat;
  $reports[] = (String)$rep->file;

}

// Constructing the xml as an array
$studyXML_array[] = array
                    (
                      'uid'      => $uid,
                      'acc'      => $acc,
                      'date'     => (String)$study->date,                          
                      'reports'  => $reports
                    );

}

我可以得到&#34; uid&#34;和&#34; acc&#34;但我无法得到#cat; cat&#34;和&#34;日期&#34;内部文件节点。 当我在调试变量中查看xml的数组时,我可以看到uid和acc属性,但没有cat和date属性的标志。

我真的很感激任何帮助。

我更喜欢坚持使用SimpleXML,因为到目前为止我的所有代码都在使用它。

干杯

2 个答案:

答案 0 :(得分:1)

这就是我基于Ghost回答的方式。

$reports = array ();
foreach($study->reports->file as $rep)
{
  $temp = array();
  $temp['repName'] = (String)$rep;

  // Getting cat and date attributes of the report
  foreach($rep->attributes() as $key => $rep)
  {
    $temp[$key] = (string) $rep;
  }

  $reports[] = $temp;
}

答案 1 :(得分:0)

如果您尝试使用print_r()/var_dump()进行检查,那么它就不会公正。但它就在那里,尝试遍历它,同时在foreach中使用->attributes()

$studyXML = new SimpleXMLElement($studyXML);
$studyXML_array = array();
foreach ($studyXML ->study as $study)
{

    // Getting uid and accession from XML attributes
    $uid = (!empty($study)) ? (String)$study->attributes()->uid : '';
    $acc = (!empty($study)) ? (String)$study->attributes()->acc : '';

    // Getting the reports and putting them in an array
    $reports = array();
    // loop each attribute
    foreach($study->reports->file->attributes() as $key => $rep)
    {
        $reports[$key] = (string) $rep;
    }

    // Constructing the xml as an array
    $studyXML_array[] = array(
        'uid'      => $uid,
        'acc'      => $acc,
        'date'     => (String) $study->date,
        'reports'  => $reports
        );
}

echo '<pre>';
print_r($studyXML_array);

Sample Output

Array
(
    [0] => Array
        (
            [uid] => 1.3.12.2
            [acc] => 181
            [date] => 20051218
            [reports] => Array
                (
                    [cat] => UNK
                    [date] => 20141124
                )

        )

)