Php 将子项添加到XML,然后转换为CSV
基本上,我有和XML文件,我转换成CSV。这非常有效,但我需要修改它,在将XML父元素转换为CSV之前,将相同的子元素添加到每个XML父元素中。我似乎只能把这个添加到第一个元素中,就这样。有没有办法自动将同一个子元素添加到XML文件中的所有元素中 这是XML 我有几千个这样的Php 将子项添加到XML,然后转换为CSV,php,xml,csv,Php,Xml,Csv,基本上,我有和XML文件,我转换成CSV。这非常有效,但我需要修改它,在将XML父元素转换为CSV之前,将相同的子元素添加到每个XML父元素中。我似乎只能把这个添加到第一个元素中,就这样。有没有办法自动将同一个子元素添加到XML文件中的所有元素中 这是XML 我有几千个这样的 <Item> <product>test</product> <Image>AC45G.jpg</Image> </Item> 测试 AC
<Item>
<product>test</product>
<Image>AC45G.jpg</Image>
</Item>
测试
AC45G.jpg
这是我的密码
<?php
$new_xml = simplexml_load_file('test.xml');
$items = $new_xml->Item;
$items->addChild('distributor', 'test');
function outputCSV($new_xml) {
$outstream = fopen("php://output", 'w');
$header=false;
foreach($new_xml as $k=>$details){
if(!$header){
fputcsv($outstream,array_keys(get_object_vars($details)));
$header=true;
}
fputcsv($outstream,get_object_vars($details));
}
fclose($outstream);
}
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=lipseys.csv");
header("Pragma: no-cache");
header("Expires: 0");
outputCSV($new_xml);
?>
项目;
$items->addChild('distributor','test');
函数outputCSV($new_xml){
$outstream=fopen(“php://output“,‘w’”;
$header=false;
foreach($k=>$details的新xml){
如果(!$header){
fputcsv($outstream,array_key(get_object_vars($details)));
$header=true;
}
fputcsv($outstream,get_object_vars($details));
}
fclose(外流);
}
标题(“内容类型:文本/csv”);
标题(“内容处置:附件;文件名=lipseys.csv”);
标题(“杂注:无缓存”);
标题(“到期日:0”);
outputCSV($new_xml);
?>
可能会像这样使用children()和foreach
<?php
foreach ($new_xml ->children() as $second_gen){
$second_gen->addChild('distributor', 'test');
}
?>
children()作为$second\u gen){
$second_gen->addChild('distributor','test');
}
?>
默认情况下,SimpleXML迭代SimpleXML元素的所有子元素,因此您需要对根元素进行foreach
(在以下名为$element
的示例中,而不是像您的问题中那样的$new\u xml
),然后将新的子元素添加到每个子元素中:
// iterate over child elements
foreach ($element as $child)
{
$child->addChild('distributor', 'test');
}
该方法的区别在于,它将使用simplexmlement
的名称空间,而不是children()
方法中给定的名称空间(可选)
通过在加载文件或实例化SimpleXMLElement时指定默认名称空间,可以更改迭代的默认名称空间。另见:
用法示例:
$xml = simplexml_load_file('test.xml');
$items = $xml;
foreach ($items as $item) {
$item->addChild('distributor', 'test: ' . $item);
}
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=lipseys.csv");
header("Pragma: no-cache");
header("Expires: 0");
$file = new SplFileObject("php://output");
foreach (new ValuesWithHeadersIterator($items) as $values) {
$file->fputcsv($values);
}
使用的迭代器:
/**
* Class ValuesIterator
*
* Treats each iteration as being (or being cast-able) to an array
* of values.
*/
class ValuesIterator extends IteratorIterator
{
public function current() {
return (array) parent::current();
}
}
/**
* Class KeysIterator
*
* Returns keys instead of values per each ValuesIterator iteration.
*/
class KeysIterator extends ValuesIterator
{
public function current() {
return array_keys(parent::current());
}
}
/**
* Class ValuesWithHeadersIterator
*
* Same as ValuesIterator but expecting the first values
* to have keys that can be used as headers
*/
class ValuesWithHeadersIterator extends IteratorIterator
{
public function __construct(Traversable $iterator) {
$headers = new LimitIterator(new KeysIterator($iterator), 0, 1);
$values = new ValuesIterator($iterator);
$append = new AppendIterator();
$append->append($headers);
$append->append($values);
parent::__construct($append);
}
}
循环遍历$items并将其添加到它的所有子元素中?但只有可能。实际上,更重要的是
foreach
,而children()
实际上是默认的迭代,因此您可以省去该方法调用。