使从ZOHO XML文件
问题描述:
密钥=>数组值我有此XML文件,并基本上我希望能够构建阵列[]key=>value
如使从ZOHO XML文件
[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()
),但都没有成功。 A print_r($obj)
显示了FL下的编号数组,我可以访问该数组,但我需要名称(“产品ID”)以及值。我做不到。我对XML一点也不熟悉,请问有人能给我一点帮助吗?在2天的搜索中找不到任何与我的问题相匹配的内容。希望我正确解释自己。
<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']
<FL>
元素值访问...
- ... “
val
” 属性值直接与$FL
联系。
要将其放入数组中,将值转换为字符串非常重要。我用的是trim
功能,铸造串(string)
会工作,太:
$array = array();
$key = trim($FL['val']);
$value = trim($FL);
$array[$key] = $value;
示范$array
则是:
Array
(
[Product Id] => productId_1
)
所以现在在XML有中的多个<FL>
-elements <product>
-elements。假设$product
将是第一个产品元素。从上面只有不拘一格一个foreach
循环内对所有<FL>
-elements包裹:
$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://*.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
)
)
非常整齐的代码和清晰的“一步一步”解释。我现在知道更多关于处理Xml的信息。它的作品非常漂亮。非常感谢。麦克风 – michael 2015-04-05 20:19:09