【发布时间】:2016-05-04 17:42:03
【问题描述】:
我必须使用 PHP 将 XML 文件中的数据解析为 CSV。我用 PHP 编写了代码,它只得到很少的细节,如果它有子节点,它不会提取节点的细节。我正在使用 XML 的一小部分进行测试,原始文件包含大量数据,大约 20,000 个人节点。下面是我的 XML 数据 --> list.xml。
<persons>
<person>
<id>326324</id>
<lastName>ABC</lastName>
<firstName>XYZ</firstName>
<middleName>PQR</middleName>
<preferredfirstName></preferredfirstName>
<details>
<JobTitle>Engineer</JobTitle>
<Dept>Healthcare</Dept>
<emp_position_no>PT0970</emp_position_no>
<emp_class_code>AJ</emp_class_code>
<emp_class_desc>Developer</emp_class_desc>
<emp_rank></emp_rank>
<CA_AddrStreet></CA_AddrStreet>
<CA_AddrCity></CA_AddrCity>
<CA_AddrState></CA_AddrState>
<CA_AddrZip></CA_AddrZip>
<CA_Phone></CA_Phone>
<EmployeeEmail>ABC@ABDA.COM</EmployeeEmail>
</details>
<Projects>
<subj_crse>MKTG 311</subj_crse>
<subj_crse>MKTG 428</subj_crse>
</Projects>
</person>
<person>
<id>956197</id>
<lastName>YTRG</lastName>
<firstName>WDES</firstName>
<middleName>BVCX</middleName>
<preferredfirstName></preferredfirstName>
<details>
<JobTitle>TECHNICIAN</JobTitle>
<Dept>Education</Dept>
<emp_position_no>PT1010</emp_position_no>
<emp_class_code>AJ</emp_class_code>
<emp_class_desc>Technician</emp_class_desc>
<emp_rank></emp_rank>
<CA_AddrStreet></CA_AddrStreet>
<CA_AddrCity></CA_AddrCity>
<CA_AddrState></CA_AddrState>
<CA_AddrZip></CA_AddrZip>
<CA_Phone></CA_Phone>
<EmployeeEmail>TRED@HDSEYY.COM</EmployeeEmail>
</details>
<Projects>
<subj_crse>TCHCS 321</subj_crse>
</Projects>
</person>
</persons>
我能够检索到节点 preferredfirstName 之前的数据,之后由于 details 节点有更多的子节点,我无法提取数据。以下是我的 PHP 代码:
$xml = simplexml_load_file('list.xml');
$i = 1;
$values = [];
$columns = array('id', 'lastName', 'firstName',
'middleName', 'preferredfirstName', 'details', 'Projects');
$fs = fopen('ODU.csv', 'w');
fputcsv($fs, $columns);
fclose($fs);
$node = $xml->xpath('//person');
foreach ($node as $n) {
$child = $xml->xpath('//person['.$i.']/*');
foreach ($child as $value) {
$values[] = $value;
}
$fs = fopen('test.csv', 'a');
fputcsv($fs, $values);
fclose($fs);
$values = [];
$i++;
}
【问题讨论】: