首页 > 解决方案 > xml child 中的图像名称不止一个,并受到 php 的限制

问题描述

我有 xml 我得到的另一个数组,但第一个无法解决这个问题

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

我无法获得第一个图像孩子"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>

标签: phpxmlforeachsimplexml

解决方案


代码有几个问题

  • 如果你想要 3 张图像,这部分if ($key <= 4) {应该小于或等于 2。
  • 当您正在编写文件时,您实际上不必返回任何内容(或者您想检查是否为假),因为save函数返回the number of bytes written or false if an error occurred.
  • $key++;在 foreach 中这样使用也可以使用 for 循环来完成,您可以在其中使用append $iafterimage
  • 不知道你为什么要使用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");

中的 xmlresult.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>

推荐阅读