Простой XML получить определенное значение на основе поля - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь получить URL PRINT_POSITION_URL на основе PRODUCT_NUMBER.

Для продукта с номером продукта 7375- 06 я хочу получить PRINT_POSITION_URL color = "06" , для продукта с номером продукта 7375- 04 я хочу получить PRINT_POSITION_URL color = "04" et c.

Эти два значения находятся в разные XML файлы, которые я получаю по URL, и они связаны с полем PRODUCT_PRINT_ID.

Вот мой первый XML файл (products. xml):

<PRODUCTS>
  <PRODUCT>
    <PRODUCT_NUMBER>7375-06</PRODUCT_NUMBER>
    <PRODUCT_NAME>Soft ball</PRODUCT_NAME>
    <PRODUCT_PRINT_ID>40002010</PRODUCT_PRINT_ID>
  </PRODUCT>
</PRODUCTS>

А вот мой второй XML файл (print-info. xml)

<PRINTINGINFORMATION>
  <PRODUCTS>
    <PRODUCT>
     <PRODUCT_PRINT_ID>40002010</PRODUCT_PRINT_ID>
      <PRINTING_POSITIONS>
        <PRINTING_POSITION>
          <PRINT_POSITION_URL color="04">https://thumb_7375_04.jpg</PRINT_POSITION_URL>
          <PRINT_POSITION_URL color="05">https://thumb_7375_05.jpg</PRINT_POSITION_URL>
          <PRINT_POSITION_URL color="06">https://thumb_7375_06.jpg</PRINT_POSITION_URL>
        </PRINTING_POSITION>
      </PRINTING_POSITIONS>
    </PRODUCT>
  </PRODUCTS>
</PRINTINGINFORMATION>

Вот что я пробовал:

<?php
header ("Content-Type:text/xml");
$xmlA = simplexml_load_file('ftp://.../prodinfo_EN.xml');
$xmlB = simplexml_load_file('ftp://.../printinfo.xml');

// create empty output xml object
$final = new simpleXMLElement('<?xml version="1.0" encoding="utf-8"?><PRODUCTINFORMATION></PRODUCTINFORMATION>'); 
$products = $final->addChild("PRODUCTS");

  foreach ($xmlA->PRODUCTS->PRODUCT as $proda) {
    $prodbaseno = (string)$proda->PRODUCT_NUMBER;
    $prodname = (string)$proda->PRODUCT_NAME;
    $prodprintid = (string)$proda->PRODUCT_PRINT_ID;

    // build the output xml
    $prodnew = $products->addChild('PRODUCT');
    $prodnew->addChild('PRODUCT_NUMBER', $prodbaseno);
    $prodnew->addChild('PRODUCT_NAME', $prodname);
    $prodnew->addChild('PRODUCT_PRINT_ID', $prodprintid);

    // find related field from xml file B based on PRODUCT_PRINT_ID
    if ($prodarr = $xmlB->xpath("PRODUCTS/PRODUCT[PRODUCT_PRINT_ID='$prodprintid']")) {
        $prodb = $prodarr[0];

        $prtposns = $prodnew->addChild('PRINTING_POSITIONS');
        foreach ($prodb->PRINTING_POSITIONS->PRINTING_POSITION as $prtpos )   {
            $posnew = $prtposns->addChild('PRINTING_POSITION');
            $posnew->addChild('PRINT_POSITION_URL', $prtpos->PRINT_POSITION_URL);
        }
    }

  }
echo $final->saveXml();
?>

И вот результат:

<PRODUCTINFORMATION>
  <PRODUCTS>
    <PRODUCT>
      <PRODUCT_NUMBER>MO7375-06</PRODUCT_NUMBER>
      <PRODUCT_NAME>Soft ball</PRODUCT_NAME>
      <PRODUCT_PRINT_ID>40002010</PRODUCT_PRINT_ID>
        <PRINTING_POSITIONS>
          <PRINTING_POSITION>
            <PRINT_POSITION_URL color="04">https://thumb_7375_04.jpg</PRINT_POSITION_URL>
          </PRINTING_POSITION>
        </PRINTING_POSITIONS>
    </PRODUCT>
  </PRODUCTS>
</PRODUCTINFORMATION>

1 Ответ

0 голосов
/ 21 марта 2020

Попробуйте изменить это на свой фактический xml:

<?php
    $stringA = <<<XML
    <PRODUCTS>
      <PRODUCT>
        <PRODUCT_NUMBER>7375-06</PRODUCT_NUMBER>
        <PRODUCT_NAME>Soft ball</PRODUCT_NAME>
      </PRODUCT>
    </PRODUCTS>
    XML;

    $xmlA = simplexml_load_string($stringA);
    $resultA = $xmlA->xpath("//PRODUCTS//PRODUCT");
    $num = $xmlA->xpath("//PRODUCT//PRODUCT_NUMBER/.");
    $tnum = implode($num);

    $stringB = <<<XML
    <PRINTINGINFORMATION>
      <PRODUCTS>
        <PRODUCT>
          <PRINTING_POSITIONS>
            <PRINTING_POSITION>
              <PRINT_POSITION_URL color="04">https://thumb_7375_04.jpg</PRINT_POSITION_URL>
              <PRINT_POSITION_URL color="05">https://thumb_7375_05.jpg</PRINT_POSITION_URL>
              <PRINT_POSITION_URL color="06">https://thumb_7375_06.jpg</PRINT_POSITION_URL>
            </PRINTING_POSITION>
          </PRINTING_POSITIONS>
        </PRODUCT>
      </PRODUCTS>
    </PRINTINGINFORMATION>
    XML;

    $xmlB = simplexml_load_string($stringB);
    $resultB = $xmlB->xpath("//PRODUCT//PRINT_POSITION_URL[@color=substring-after('{$tnum}','-')]/text()");

    // create empty output xml object
    $final = new simpleXMLElement('<?xml version="1.0" encoding="utf-8"?><PRODUCTINFORMATION></PRODUCTINFORMATION>'); 
    $products = $final->addChild("PRODUCTS");

     foreach ($resultA as $proda) {
        $prodbaseno = (string)$proda->PRODUCT_NUMBER;
        $prodname = (string)$proda->PRODUCT_NAME;

        // build the output xml
        $prodnew = $products->addChild('PRODUCT');
        $prodnew->addChild('PRODUCT_NUMBER', $prodbaseno);
        $prodnew->addChild('PRODUCT_NAME', $prodname);

    foreach ($resultB as $prtpos )   {
          $prodnew->addChild('PRINT_POSITION_URL', $prtpos);
        }

      }

    echo $final->saveXml();
    ?>

Вывод соответствует вашему вопросу.

...