我想決議 xml 檔案。它適用于進口商,您可以在其中定義配置
我的問題是,xml 決議器(SimpleXml 和 Dom)做的不一致。
當我只有一個子節點時 - 它會給我一個 simpleXML
<sizes>
<size>
<gpp> 5,00</gpp>
<gppcurrency>EUR</gppcurrency>
<npp> 5,00</npp>
<nppcurrency>EUR</nppcurrency>
<sp> 5,00</sp>
<spcurrency>EUR</spcurrency>
<stock>100</stock>
</size>
</sizes>
將會
sizes [SimpleXmlElement]
=> size [SimpleXmlElement]
- gpp
- gppcurrency
...
但是如果我有多個節點
<sizes>
<size>
<gpp> 5,00</gpp>
<gppcurrency>EUR</gppcurrency>
<npp> 5,00</npp>
<nppcurrency>EUR</nppcurrency>
<sp> 5,00</sp>
<spcurrency>EUR</spcurrency>
<stock>100</stock>
</size>
<size>
<gpp> 5,00</gpp>
<gppcurrency>EUR</gppcurrency>
<npp> 5,00</npp>
<nppcurrency>EUR</nppcurrency>
<sp> 5,00</sp>
<spcurrency>EUR</spcurrency>
<stock>100</stock>
</size>
</sizes>
它會輸出
sizes [SimpleXmlElement]
=> size array
[0] [SimpleXmlElement]
- gpp
- gppcurrency
...
[1] [SimpleXmlElement]
- gpp
- gppcurrency
...
這真的很矛盾,你可以幫我找到答案。謝謝
uj5u.com熱心網友回復:
內部部件是否使用陣列并不重要。回傳的是一個SimpleXMLElement帶有 getter 的物件(不是裸陣列),無論哪種情況都將回傳一個可迭代的值。您看到的陣列是值在 中的存盤方式SimpleXMLElement,但是當您訪問它時,它將處理將單個子項轉換為可迭代值。
foreach($singleNode->size as $size) {
var_dump($size);
}
// object(SimpleXMLElement) { ["gpp"] ... }
foreach($multiNode->size as $size) {
var_dump($size);
}
// object(SimpleXMLElement) { ["gpp"] ... }
// object(SimpleXMLElement) { ["gpp"] ... }
uj5u.com熱心網友回復:
我找到了一致地獲取陣列的解決方案。
<?php
declare(strict_types=1);
namespace src\ImExport\Formatter;
use SimpleXMLElement;
class XmlToArrayFormatter
{
public function parseXmlToArray(SimpleXmlElement $xml, $collection = [])
{
$childNodes = $xml->children();
if (0 === $childNodes->count()) {
if (empty($xml)) {
return false;
}
return strval($xml);
}
$currentNodeAsArray = false;
if ($this->getNodeLevel($xml) > 0 &&
$this->hasOnlySubNodes($xml) &&
!is_string($xml)) {
$currentNodeAsArray = true;
}
foreach ($childNodes as $nodeName => $nodeValue) {
$xmlArray = $this->parseXmlToArray($nodeValue);
if ($currentNodeAsArray) {
$collection[$nodeName][] = $xmlArray;
} else {
if ($xmlArray !== false) {
$collection[$nodeName] = $xmlArray;
}
}
}
return $collection;
}
protected function getNodeLevel(?SimpleXMLElement $parentNodes, $level = 0): int
{
if (is_null($parentNodes)) {
return $level;
}
if (count($parentNodes->children())) {
$level ;
}
foreach ($parentNodes->children() as $parentNodeValues) {
$level = $this->getNodeLevel($parentNodeValues, $level);
}
return $level;
}
public function hasOnlySubNodes(?SimpleXMLElement $node): bool
{
foreach ($node->children() as $nodeValues) {
if (count($nodeValues->children()) == 0 && !empty(strval($nodeValues))) {
return false;
}
}
return true;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516564.html
標籤:phpxml解析
上一篇:從網站獲取空標簽
