生成密钥=>;来自zoho XML文件的值数组


Make key=>value array from zoho XML file

我有这个XML文件,基本上我希望能够构造一个数组[]key=>value,比如

[0]['Product Id']=>productId_1,
[0]['Product Name']=>product_name_1...
[1]['Product Id']=>productId_2,
[1]['Product Name']=>product_name_2

等等。我尝试过simplexml_load_file,但很难到达节点(getName()attributes()),但都没有成功。print_r($obj)显示FL下的一个编号数组,我可以访问它,但我需要名称("产品ID")和值。我做不到。我对XML一点也不熟悉,有人能帮我一点忙吗?在两天的搜索中找不到任何与我的问题相匹配的内容。希望我能正确地解释自己。

<Invoices>
    <row num="1">
        <FL val="Product Details">
            <product no="1">
                <FL val="Product Id">productId_1</FL>
                <FL val="Product Name">product_name_1</FL>
                <FL val="Quantity">1</FL>
                <FL val="List Price">1.00</FL>
                <FL val="Discount">0</FL>
                <FL val="Total">1.00</FL>
                <FL val="Total After Discount">1.00</FL>
                <FL val="Tax">0</FL>
                <FL val="Net Total">1.00</FL>
            </product>
        </FL>
    </row>
    <row num="....">
    </row>
</Invoices>

让我们看看这在SimpleXML:中是如何工作的

<FL val="Product Id">productId_1</FL>
       ^^^              ^^^
        |                |
 "val" attribute         |
                   <FL> element

假设这个XML <FL>元素将存储在变量$FL中,然后您可以访问。。。

  • 。。。具有$FL['val']的"val"属性值
  • 。。。CCD_ 10元素值与CCD_

要将其放入数组中,将值转换为字符串非常重要。为此,我使用了trim函数,用(string)转换为字符串也可以:

$array = array();
$key   = trim($FL['val']);
$value = trim($FL);
$array[$key] = $value;

则示例性$array是:

Array
(
    [Product Id] => productId_1
)

因此,现在XML中的<product>元素中有多个<FL>元素。假设$product将是第一个乘积元素。上面的线路只需要在所有<FL>元素上的foreach环路中进行包裹:

$array = array();
foreach ($product->FL as $FL) {
    $key   = trim($FL['val']);
    $value = trim($FL);
    $array[$key] = $value;
}

则示例性$array是:

Array
(
    [Product Id] => productId_1
    [Product Name] => product_name_1
    [Quantity] => 1
    [List Price] => 1.00
    [Discount] => 0
    [Total] => 1.00
    [Total After Discount] => 1.00
    [Tax] => 0
    [Net Total] => 1.00
)

现在,您只需要转换所有产品。因为它适用于所有产品,就像适用于一个产品一样,所以你可以将逻辑放入它自己的函数中:

function product(SimpleXMLElement $product)
{
    $array = array();
    foreach ($product->FL as $FL) {
        $key         = trim($FL['val']);
        $value       = trim($FL);
        $array[$key] = $value;
    }
    return $array;
}

然后使用xpath查询获取所有产品元素并进行映射:

$xml = simplexml_load_string($buffer);
$result = array_map('product', $xml->xpath('//product'));

输出为:

Array
(
    [0] => Array
        (
            [Product Id] => productId_1
            [Product Name] => product_name_1
            [Quantity] => 1
            [List Price] => 1.00
            [Discount] => 0
            [Total] => 1.00
            [Total After Discount] => 1.00
            [Tax] => 0
            [Net Total] => 1.00
        )
)

我希望这能让你明白一点。

这里有一个完整的例子:

<?php
/**
 * Make key=>value array from zoho XML file
 * @link http://stackoverflow.com/a/29461013/367456
 */
$buffer = <<<XML
<Invoices>
    <row num="1">
        <FL val="Product Details">
            <product no="1">
                <FL val="Product Id">productId_1</FL>
                <FL val="Product Name">product_name_1</FL>
                <FL val="Quantity">1</FL>
                <FL val="List Price">1.00</FL>
                <FL val="Discount">0</FL>
                <FL val="Total">1.00</FL>
                <FL val="Total After Discount">1.00</FL>
                <FL val="Tax">0</FL>
                <FL val="Net Total">1.00</FL>
            </product>
        </FL>
    </row>
    <row num="....">
    </row>
</Invoices>
XML;
function product(SimpleXMLElement $product)
{
    $array = array();
    foreach ($product->FL as $FL) {
        $key         = trim($FL['val']);
        $value       = trim($FL);
        $array[$key] = $value;
    }
    return $array;
}
$xml = simplexml_load_string($buffer);
$result = array_map('product', $xml->xpath('//product'));
print_r($result);

DOMDocument与一些DOMXPath查询结合使用:

$source = <<<EOS
       <Invoices>
       <row num="1">
            <FL val="Product Details">
                <product no="1">
                    <FL val="Product Id">productId_1</FL>
                    <FL val="Product Name">product_name_1</FL>
                    <FL val="Quantity">1</FL>
                    <FL val="List Price">1.00</FL>
                    <FL val="Discount">0</FL>
                    <FL val="Total">1.00</FL>
                    <FL val="Total After Discount">1.00</FL>
                    <FL val="Tax">0</FL>
                    <FL val="Net Total">1.00</FL>
                </product>
           </FL>
        </row>
        <row num="2">
            <FL val="Product Details">
                <product no="2">
                    <FL val="Product Id">productId_2</FL>
                    <FL val="Product Name">product_name_2</FL>
                    <FL val="Quantity">2</FL>
                    <FL val="List Price">2.00</FL>
                    <FL val="Discount">0</FL>
                    <FL val="Total">2.00</FL>
                    <FL val="Total After Discount">2.00</FL>
                    <FL val="Tax">0</FL>
                    <FL val="Net Total">2.00</FL>
                </product>
           </FL>
        </row>
    </Invoices>
EOS;
$dom = new DOMDocument();
$dom->loadXML($source);
$xpath = new DOMXPath($dom);
$products = $xpath->query('//product');
foreach ($products as $product) {
    $fls = $xpath->query('.//FL', $product);
    $row = [];
    foreach ($fls as $fl) {
        $row[$fl->getAttribute('val')] = $fl->nodeValue;
    }
    $result[] = $row;
}
print_r($result);

输出:

Array
(
    [0] => Array
        (
            [Product Id] => productId_1
            [Product Name] => product_name_1
            [Quantity] => 1
            [List Price] => 1.00
            [Discount] => 0
            [Total] => 1.00
            [Total After Discount] => 1.00
            [Tax] => 0
            [Net Total] => 1.00
        )
    [1] => Array
        (
            [Product Id] => productId_2
            [Product Name] => product_name_2
            [Quantity] => 2
            [List Price] => 2.00
            [Discount] => 0
            [Total] => 2.00
            [Total After Discount] => 2.00
            [Tax] => 0
            [Net Total] => 2.00
        )
)