图片名称在 xml child 中超过一个,并受到 php 的限制

image name in xml child more than one and get limitation with php

我有 xml 另一个数组我知道了但是第一个不能我怎么解决这个

Xml 这样的结构并在 xml 到 php 中得到错误代码第一个不是数组第二个是数组

我没有得到第一张图片children"sitename/11.jpg"

Xml 像这样

 [images] => SimpleXMLElement Object ( [image] => Array ( [0] => sitename/15.jpg [1] => sitename/16.jpg [2] => sitename/17.jpg [3] => sitename/18.jpg ) ) )

 [images] => SimpleXMLElement Object ( [image] => sitename/11.jpg ))
<root>
<result>
<node>
<categories>somecategory<categories/>
<images>
<image>sitename/15.jpg</image><image>sitename/16.jpg</image><image>sitename/17.jpg</image><image>sitename/18.jpg</image>
</images>
</node>
<node>
<categories>somecategory<categories/>
<images>
<image>sitename/11.jpg</image>
</images>
</node>
  </result>
      </root>


function solve_something($xml, $destination)
{
    $xml = simplexml_load_file($xml, "SimpleXMLElement", LIBXML_NOCDATA);
    $json = json_encode($xml);
    $items = json_decode($json, TRUE);
    $products = array();
    $product_data = array();
    $row = 1;
foreach ($items['result']['node'] as $item) {
    $product_data['Categories'] = 'categories';
    if (isset($item['images']['image'])) {
        if (is_array($item['images']['image'])) {
            foreach ($item['images']['image'] as $key => $image) {
                $key++;
                if ($key <= 4) {
                    $image_name = 'image' . $key;
                    $product_data[$image_name] = isset($image) ? $image : null;
                }
            }
        } else {
            $product_data['image'] = isset($image) ? $image : null;
        }
    }

$path = createXML($products, $destination);
return $path;
}
The other function code its create the xml file

function createXML($data, $destination)
{

    $xmlDoc = new DOMDocument('1.0', 'UTF-8');
    $root = $xmlDoc->appendChild($xmlDoc->createElement("root"));
    foreach ($data as $key => $product) {

        $productA = $root->appendChild($xmlDoc->createElement('product'));
        foreach ($product as $key1 => $val) {
            if (!empty($val)) {
                if ($key1 == 'price' || $key1 == 'tax' || $key1 == 'stockAmount') {
                    $productA->appendChild($xmlDoc->createElement($key1, $val));
                } else {
                    $ProductKey = $productA->appendChild($xmlDoc->createElement($key1));
                    $ProductKey->appendChild($xmlDoc->createCDATASection($val));
                }
            }
        }
    }
    $xmlDoc->formatOutput = true;
    fn_rm($destination);
    $xmlDoc->save($destination);
    return $destination;
}

代码创建

<root>
  <product>
<categories>somecategory<categories/>
<images>
<image1>sitename/15.jpg
<image2>sitename/16.jpg
<image3>sitename/17.jpg
</images>
  </product>
  <product>
<categories>somecategory<categories/>
<images>
<image1>sitename/15.jpg
<image2>sitename/16.jpg
<image3>sitename/17.jpg
<image4>sitename/18.jpg
</images>
  </product>
</root>

但是我想要

<root>
  <product>
<categories>somecategory<categories/>
<images>
<image1>sitename/15.jpg
<image2>sitename/16.jpg
<image3>sitename/17.jpg
</images>
  </product>
  <product>
<categories>somecategory<categories/>
<images>
<image1>sitename/11.jpg
</images>
  </product>
</root>

代码存在一些问题

  • 如果你想要3张图片,这部分if ($key <= 4) {应该小于或等于2.
  • 你真的不需要 return 任何东西(或者你想检查错误),因为你正在写一个文件,因为 save 函数 returns the number of bytes written or false if an error occurred.
  • 在 foreach 中像这样使用 $key++; 也可以使用 for 循环来完成,您可以在其中使用 $iimage
  • 之后追加
  • 不确定为什么要使用 createCDATASection,但我已将那部分省略以获得所需的结果
  • 因为您有 node 的多个部分,您可以在每次迭代中使用一个 $product_data 数组来将值添加到 foreach 之后,将 $product_data 添加到 $products 数组以防止覆盖每个循环的值。

更新后的代码可能看起来像

function solve_something($xml, $destination)
{
    $xml = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA);
    $json = json_encode($xml);
    $items = json_decode($json, TRUE);
    $products = array();

    foreach ($items['result']['node'] as $item) {
        $product_data = array();
        $category = $item["categories"];
        $product_data["categories"] = $category;
        if (isset($item['images']['image'])) {
            if (is_array($item['images']['image'])) {
                for ($i = 0; $i < count($item['images']['image']); $i++) {
                    if ($i < 3) $product_data["image" . ($i + 1)] = $item['images']['image'][$i];
                }
            } else $product_data["image1"] = $item['images']['image'];
        }
        $products[] = $product_data;
    }
    createXML($products, $destination);
}

function createXML($data, $destination)
{
    $xmlDoc = new DOMDocument('1.0', 'UTF-8');
    $root = $xmlDoc->appendChild($xmlDoc->createElement("root"));

    foreach ($data as $key => $product) {
        $productA = $root->appendChild($xmlDoc->createElement('product'));
        $imagesElm = $xmlDoc->createElement('images');
        foreach ($product as $key1 => $val) {
            if ($key1 == 'price' || $key1 == 'tax' || $key1 == 'stockAmount' || $key1 === "categories") {
                $productA->appendChild($xmlDoc->createElement($key1, $val));
            } elseif (substr($key1, 0, 5) === "image") {
                $imagesElm->appendChild($xmlDoc->createElement($key1, $val));
            }
        }
        $productA->appendChild($imagesElm);
    }

    $xmlDoc->formatOutput = true;
    $xmlDoc->save($destination);
}

$xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<root>
    <result>
        <node>
            <categories>somecategory</categories>
            <images>
                <image>sitename/15.jpg</image>
                <image>sitename/16.jpg</image>
                <image>sitename/17.jpg</image>
                <image>sitename/18.jpg</image>
            </images>
        </node>
        <node>
            <categories>somecategory</categories>
            <images>
                <image>sitename/11.jpg</image>
            </images>
        </node>
    </result>
</root>
XML;

solve_something($xml, "result.xml");

result.xml中的xml看起来像

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <product>
    <categories>somecategory</categories>
    <images>
      <image1>sitename/15.jpg</image1>
      <image2>sitename/16.jpg</image2>
      <image3>sitename/17.jpg</image3>
    </images>
  </product>
  <product>
    <categories>somecategory</categories>
    <images>
      <image1>sitename/11.jpg</image1>
    </images>
  </product>
</root>