Php 从zoho XML文件生成key=>value数组

Php 从zoho XML文件生成key=>value数组,php,arrays,xml,Php,Arrays,Xml,我有这个XML文件,基本上我希望能够构造一个数组[]key=>值,比如 [0]['Product Id']=>productId_1, [0]['Product Name']=>产品名称\u 1。。。 [1] ['Product Id']=>productId_2, [1] ['Product Name']=>产品名称\u 2 等等。我尝试过simplexml_load_文件,但很难找到节点getName和属性,但没有成功。print_r$obj在FL下显示了一个编号的数组,我可以访问该数组,但

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

[0]['Product Id']=>productId_1, [0]['Product Name']=>产品名称\u 1。。。 [1] ['Product Id']=>productId_2, [1] ['Product Name']=>产品名称\u 2 等等。我尝试过simplexml_load_文件,但很难找到节点getName和属性,但没有成功。print_r$obj在FL下显示了一个编号的数组,我可以访问该数组,但我需要名称Product ID以及值。这是我做不到的。我对XML一点也不熟悉,谁能帮我一点忙吗?在2天的搜索中找不到与我的问题匹配的任何内容。希望我能解释清楚

productId_1 产品名称1 1. 1 0 1 1 0 1 将DOMDocument与一些DOMPath查询结合使用:


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

productId_1 ^^^ ^^^ | | val属性| 要素 假设这个XML元素将存储在变量$FL中,然后您可以访问

... 带有$FL['val']的val属性值 ... 直接使用$FL的元素值。 要将其放入数组中,必须将值转换为字符串。我使用这个函数,用string转换string也可以:

$array = array();
$key   = trim($FL['val']);
$value = trim($FL);
$array[$key] = $value;
示例性的$array是:

因此,在XML中,元素中有多个元素。假设$product将是第一个产品元素。上面的行只需要在所有元素上的foreach循环中进行包装:

$array = array();
foreach ($product->FL as $FL) {
    $key   = trim($FL['val']);
    $value = trim($FL);
    $array[$key] = $value;
}
示例性的$array是:

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

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);

非常整洁的代码和清晰的逐步解释。我现在对处理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'));
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);