我有这个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
)
)