【问题标题】:CSV to XML add more headerCSV 到 XML 添加更多标题
【发布时间】:2015-07-04 02:07:58
【问题描述】:

我遇到了以下问题:

我有一个 csv 文件,我可以通过 php 脚本将其转换为 XML。

这样,每个字段都在 xml 中的同一行下,我希望 product_sku 字段在不同的行下,例如将其命名为 SKU_row

CSV 看起来像这样:

my CSV file

XML 如下所示:

my XML file

我运行的将 CSV 转换为 XML 的 PHP 文件代码:

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', true);
ini_set('auto_detect_line_endings', true);

function PrepareXMLName($PrepareString)
{

    $PrepareString = str_replace(" ","",$PrepareString);
    $PrepareString = preg_replace('#\W#', '', $PrepareString);
    $PrepareString = str_replace("ZSPAZESZ","",$PrepareString);
    $PrepareString = strtolower($PrepareString);

    return $PrepareString;
}   

$inputFilename    = 'faszom.csv';
$outputFilename   = 'faszom.xml';

// Open csv to read
$inputFile  = fopen($inputFilename, 'rt');

// Get the headers of the file
$headers = fgetcsv($inputFile);

// Create a new dom document with pretty formatting
$doc  = new DomDocument();
$doc->formatOutput   = true;

// Add a root node to the document
$root = $doc->createElement('rows');
$root = $doc->appendChild($root);

// Loop through each row creating a <row> node with the correct data
while (($row = fgetcsv($inputFile)) !== FALSE)
{
    $container = $doc->createElement('row');
    foreach ($headers as $i => $header)
        {
        $header = str_replace(chr(32),"_",trim($header));
        $header = strtolower($header);
        if($header==''){ $header = 'empty';}
        $header = PrepareXMLName($header);
        if(is_numeric($header)) { $header = "number-". $header; }
        //echo "HERE: " . $header . "<br />";  
        $child = $doc->createElement($header);
        $child = $container->appendChild($child);
        $value = $doc->createTextNode($row[$i]);
        $value = $child->appendChild($value);
        }
    $root->appendChild($container);
}

header("Content-type: text/xml");
$strxml = $doc->saveXML();
$handle = fopen($outputFilename, "w");
fwrite($handle, $strxml);
fclose($handle);

echo $doc->saveXML();

我该如何在这个 PHP 文件中,让它将 product_sku 字段放在不同的行下,使其与客户数据所在的行分开?

【问题讨论】:

    标签: php xml csv


    【解决方案1】:

    XML 允许您在更高级别上进行分组。所以代替你的平排模型:

    <rows>
        <row>
            <product_sku>L162L</product_sku>
            <order_entity_id>31</order_entity_id>
            <order_customer_firstname>Teszt</order_customer_firstname>
            <product_qty_ordered>1.0000</product_qty_ordered>
        </row>
    

    您可以根据数据的上下文进一步分组,例如按订单、产品和客户:

    <rows>
        <row>
            <product>
                <sku>L162L</sku>
                <qty_ordered>1.0000</qty_ordered>
            <product>
            <order>
                <entity_id>31</entity_id>
                <customer>
                    <firstname>Teszt</firstname>
                </customer>                
            </order>            
        </row>
    

    但这完全取决于你想要什么,从你的问题来看,我看不出有任何理由说明为什么要这样做、那样或任何其他方式,也不知道有什么阻碍你做任何事情你想要的。

    【讨论】:

    • 您在下面发布的内容正是我想要做的,但是使用了那个 php 文件。我正在寻找解决方案,如何通过该 php 文件对 XML 元素进行分组。谢谢。
    • DOMDocument 中的每个节点都有一个父节点(但不是文档节点)。所以你也可以添加子元素:) 所以你创建一个元素,然后将它添加为子元素。从技术上讲,这正是您已经完成的。带上你想要的父母。您还应该能够找到有关如何使用 PHP 中的 DOM 完成此操作的现有问答材料。不求码,自己搜吧。
    • 我完全坚持这个:(我不是程序员,你能帮我一下怎么做吗?只是一个修改过的示例代码,其余的也许我可以自己做。谢谢!
    猜你喜欢
    • 2020-04-23
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多