XML 到 PHP 中的 CSV
XML to CSV in PHP
我正在尝试使用下面的代码将 XML 转换为 CSV,但它仅在只有一行的情况下才有效。多个条目将仅显示 headers/column 个名称。
这是我的 XML 的样子:
<Cars>
<Type>B</Type>
<Car>
<Brand>Car1</Brand>
<Model>M1</Model>
<Year>2010</Year>
<Age>9</Age>
<Desciption>test</Desciption>
</Car>
</Cars>
<Cars>
<Type>B</Type>
<Car>
<Brand>Car2</Brand>
<Model>M2</Model>
<Year>2015</Year>
<Age>4</Age>
<Desciption>test</Desciption>
</Car>
</Cars>
我的代码:
$filexml='cars.xml';
$cname=array();
$cname[] = 'Brand';
$cname[] = 'Model';
$cname[] = 'Year';
$cname[] = 'Age';
$cname[] = 'Desciption';
if (file_exists($filexml)) {
$xml = simplexml_load_file($filexml);
$f = fopen('cars.csv', 'w') or die('Can\'t create .csv file, try again later.');
fputcsv($f, $cname);
foreach ($xml->Car as $Car) {
fputcsv($f, get_object_vars($Car),',','"');
}
fclose($f);
}
对于每个 child node/tag 你必须使用 __toString()
方法。
像那样:
foreach ($xml->Car as $Car) {
$row = [];
foreach ($cname as $node) {
// Here we address to the Car's child node with name from your array above
$row[$node] = $Car->{$node}->__toString();
}
fputcsv($f, $row, ',' ,'"');
}
fclose($f);
假设您的 XML 实际上是有效的(只有一个根元素),那么结构的简化视图是这样的:
<document>
<Cars>
<Car>
<Brand>Car1</Brand>
</Car>
</Cars>
<Cars>
<Car>
<Brand>Car2</Brand>
</Car>
</Cars>
</document>
请注意,同一级别有多个Cars
节点,但每个节点只有一个Car
。
当您加载 XML 时,您的初始 PHP 变量将代表 <document>
元素。
因此您可以像这样手动访问前两个品牌((string)
从 XML 元素获取文本内容):
(string)$xml->Cars[0]->Car->Brand
(string)$xml->Cars[1]->Car->Brand
要获取所有品牌,您需要遍历 $xml->Cars
:
foreach ( $xml->Cars as $CarsNode ) {
$CarNode = $CarsNode->Car;
$brand = (string)$CarNode->Brand;
}
从那里,您可以使用现有代码将一行写入 CSV 文件。
我正在尝试使用下面的代码将 XML 转换为 CSV,但它仅在只有一行的情况下才有效。多个条目将仅显示 headers/column 个名称。
这是我的 XML 的样子:
<Cars>
<Type>B</Type>
<Car>
<Brand>Car1</Brand>
<Model>M1</Model>
<Year>2010</Year>
<Age>9</Age>
<Desciption>test</Desciption>
</Car>
</Cars>
<Cars>
<Type>B</Type>
<Car>
<Brand>Car2</Brand>
<Model>M2</Model>
<Year>2015</Year>
<Age>4</Age>
<Desciption>test</Desciption>
</Car>
</Cars>
我的代码:
$filexml='cars.xml';
$cname=array();
$cname[] = 'Brand';
$cname[] = 'Model';
$cname[] = 'Year';
$cname[] = 'Age';
$cname[] = 'Desciption';
if (file_exists($filexml)) {
$xml = simplexml_load_file($filexml);
$f = fopen('cars.csv', 'w') or die('Can\'t create .csv file, try again later.');
fputcsv($f, $cname);
foreach ($xml->Car as $Car) {
fputcsv($f, get_object_vars($Car),',','"');
}
fclose($f);
}
对于每个 child node/tag 你必须使用 __toString()
方法。
像那样:
foreach ($xml->Car as $Car) {
$row = [];
foreach ($cname as $node) {
// Here we address to the Car's child node with name from your array above
$row[$node] = $Car->{$node}->__toString();
}
fputcsv($f, $row, ',' ,'"');
}
fclose($f);
假设您的 XML 实际上是有效的(只有一个根元素),那么结构的简化视图是这样的:
<document>
<Cars>
<Car>
<Brand>Car1</Brand>
</Car>
</Cars>
<Cars>
<Car>
<Brand>Car2</Brand>
</Car>
</Cars>
</document>
请注意,同一级别有多个Cars
节点,但每个节点只有一个Car
。
当您加载 XML 时,您的初始 PHP 变量将代表 <document>
元素。
因此您可以像这样手动访问前两个品牌((string)
从 XML 元素获取文本内容):
(string)$xml->Cars[0]->Car->Brand
(string)$xml->Cars[1]->Car->Brand
要获取所有品牌,您需要遍历 $xml->Cars
:
foreach ( $xml->Cars as $CarsNode ) {
$CarNode = $CarsNode->Car;
$brand = (string)$CarNode->Brand;
}
从那里,您可以使用现有代码将一行写入 CSV 文件。