【问题标题】:SimpleXML get certain value based on a fieldSimpleXML 根据字段获取特定值
【发布时间】:2020-03-21 01:06:16
【问题描述】:

我正在尝试根据 PRODUCT_NUMBER 获取 PRINT_POSITION_URL 的 url。

对于产品编号为 7375-06 的产品,对于产品编号为 7375-04 的产品,我想获取 PRINT_POSITION_URL color="06" > 我想得到 PRINT_POSITION_URL color="04" 等。

这两个值位于不同的 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>

【问题讨论】:

  • 您的问题不清楚。您是要获取具有 color="06" 的产品的 url,还是要获取 06 本身的值,因为它是第三种颜色,还是什么?此外,使用更多代码(包含所有变量)编辑问题。

标签: php xml simplexml


【解决方案1】:

在你的实际 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();
    ?>

输出是您的问题。

【讨论】:

  • 感谢您的帮助,我的问题有误。我没有意识到我应该提到我从两个不同的 XML 文件中获取数据。我已经更新了我的问题。任何帮助将不胜感激。
  • 感谢您的回复。我必须提到,我正在基于一个相关字段从两个不同的 XML 文件中获取值。我试过你的代码,但它不能正常工作。我再次更新了我的问题,因为我的 php 代码不起作用。你可以再检查一遍。
  • 在尝试根据您的回答寻找解决方案后,我发现$resultB = $xmlB-&gt;xpath("//PRODUCT//PRINT_POSITION_URL[@color=substring-after('{$tnum}','-')]/text()"); 不起作用。如果我将[@color=substring-after('{$tnum}','-')] 替换为产品编号,例如[@color=substring-after('MO7375-06','-')] 输出正确的结果。有什么想法吗?
  • @Billy $tnum 是插入到 xpath 表达式中的变量。一些 php 引擎使用它而不使用花括号;尝试这种方式,看看它是否有效。但原则上,与'{$tnum}' 一起使用是有效的。
  • 我尝试删除花括号,也尝试使用括号(括号),但它不起作用。我还尝试了[@color=('$tnum')] 并将$tnum(即PRODUCT_NUMBER)的值更改为06,它正在工作。我相信问题在于substring-after 和变量$tnum 在一起。当我使用substring-after 回显$tnum 似乎不起作用时,我得到的输出是7375-06 而不是06
猜你喜欢
  • 2013-07-06
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 2012-03-24
  • 1970-01-01
  • 2023-01-07
相关资源
最近更新 更多