简体   繁体   English

从XML节点获取数据

[英]Getting data from XML nodes

I am a beginner on PHP and XML. 我是PHP和XML的初学者。

I have a XML file as below (partly): 我有一个XML文件,如下所示(部分):

<combination>
  <id_combination>2289</id_combination>
  <quantity>4</quantity>
  <unit_price_impact>0.000000</unit_price_impact>
  <reference>K10100.1B</reference>
  <group_name>Color</group_name>
  <attribute_name>Blue</attribute_name>
</combination>

<combination>
  <id_combination>2289</id_combination>
  <quantity>4</quantity>
  <unit_price_impact>0.000000</unit_price_impact>
  <reference>K10100.1B</reference>
  <group_name>Size</group_name>
  <attribute_name>1</attribute_name>
</combination>

<combination>
  <id_combination>2290</id_combination>
  <quantity>20</quantity>
  <unit_price_impact>0.000000</unit_price_impact>
  <reference>K10100.2B</reference>
  <group_name>Color</group_name>
  <attribute_name>Blue</attribute_name>
</combination>

<combination>
  <id_combination>2290</id_combination>
  <quantity>20</quantity>
  <unit_price_impact>0.000000</unit_price_impact>
  <reference>K10100.2B</reference>
  <group_name>Size</group_name>
  <attribute_name>2</attribute_name>
</combination>

And i desire to get an array as described below: 我希望获得如下所述的数组:

$id_combination => 2289
$reference => K10100.1B
$combination_name => Color: Blue / Size: 1
$quantity => 4

$id_combination => 2290
$reference => K10100.2B
$combination_name => Color: Blue / Size: 2
$quantity => 20

I want to join data with the same 'id_combination' nodes and then process it in PHP. 我想使用相同的“ id_combination”节点联接数据,然后在PHP中对其进行处理。

I tried to use "foreach" loop, "array_unique", "implode" and etc.. but wasn't able to get any success. 我尝试使用“ foreach”循环,“ array_unique”,“ implode”等。但是无法获得任何成功。

I would appreciate anyone would help me straight to result with the suggested code. 我希望有人能帮助我直接获得建议的代码。

i just did the following changes to your xml and have append new code and look and worked on my xampp server 我只是对您的xml进行了以下更改,并追加了新代码,并在我的xampp服务器上工作

$xml='<?xml version="1.0" encoding="UTF8"?>
        <combinations>
            <combination>
              <id_combination>2289</id_combination>
              <quantity>4</quantity>
              <unit_price_impact>0.000000</unit_price_impact>
              <reference>K10100.1B</reference>
              <group_name>Color</group_name>
              <attribute_name>Blue</attribute_name>
            </combination>

            <combination>
              <id_combination>2289</id_combination>
              <quantity>4</quantity>
              <unit_price_impact>0.000000</unit_price_impact>
              <reference>K10100.1B</reference>
              <group_name>Size</group_name>
              <attribute_name>1</attribute_name>
            </combination>

            <combination>
              <id_combination>2290</id_combination>
              <quantity>20</quantity>
              <unit_price_impact>0.000000</unit_price_impact>
              <reference>K10100.2B</reference>
              <group_name>Color</group_name>
              <attribute_name>Blue</attribute_name>
            </combination>

            <combination>
              <id_combination>2290</id_combination>
              <quantity>20</quantity>
              <unit_price_impact>0.000000</unit_price_impact>
              <reference>K10100.2B</reference>
              <group_name>Size</group_name>
              <attribute_name>2</attribute_name>
            </combination>
        </combinations>';
        $xmlobject = simplexml_load_string($xml);
        echo '<pre>';
        // this print an array of objects
        print_r($xmlobject);
        // this print the associative array
        print_r((array)$xmlobject);

Consider an XSLT solution as this is a typical need for the Muenchian Method in XSLT 1.0 used to group nodes by various keys. 考虑XSLT解决方案,因为这是XSLT 1.0中Muenchian方法的典型需求,该方法用于通过各种键对节点进行分组。 As information, XSLT is a special-purpose language designed to transform XML files and like most general purpose languages, PHP maintains an XSLT processor. 作为信息, XSLT是一种专用语言,旨在转换XML文件,并且像大多数通用语言一样,PHP维护XSLT处理器。

XSLT Script (save as .xsl to be loaded in script below) XSLT脚本(另存为.xsl以在下面的脚本中加载)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

<xsl:key name="idkey" match="combination" use="id_combination" />

  <xsl:template match="combinations">
    <xsl:copy>
      <xsl:apply-templates select="combination[generate-id() =
                                   generate-id(key('idkey',id_combination)[1])]"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="combination[generate-id() =
                       generate-id(key('idkey',id_combination)[1])]">
    <xsl:copy>
      <xsl:copy-of select="id_combination|quantity|unit_price_impact|reference"/>
      <combination_name>
        <xsl:for-each select="key('idkey',id_combination)">
          <xsl:value-of select="concat(group_name, ': ', attribute_name)" />
            <xsl:if test="position() != last()">
                <xsl:text> / </xsl:text>
            </xsl:if>               
        </xsl:for-each>
      </combination_name>
    </xsl:copy>
  </xsl:template>

</xsl:transform>

PHP Script PHP脚本

// LOAD XML AND XSL FILES
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('Input.xml');

$xslfile = new DOMDocument('1.0', 'UTF-8');
$xslfile->load('XSLTScript.xsl');

// TRANSFORM XML with XSLT
$proc = new XSLTProcessor;
$proc->importStyleSheet($xslfile); 
$newXml = $proc->transformToXML($xml);

// ECHO OUTPUT STRING
echo $newXml;

$xml = new SimpleXMLElement($newXml);
$xpath = $xml->xpath('//combination');

$array = [];    
foreach($xpath as $result){
    $inner = [];
    foreach ($result as $node => $item) {        
        $inner[$node] = (string)$item;
    }
    $array[] = $inner;
}

var_dump($array);

Transformed XML 转换后的XML

 <?xml version="1.0" encoding="UTF-8"?>
 <combinations>
   <combination>
     <id_combination>2289</id_combination>
     <quantity>4</quantity>
     <unit_price_impact>0.000000</unit_price_impact>
     <reference>K10100.1B</reference>
     <combination_name>Color: Blue / Size: 1</combination_name>
   </combination>
   <combination>
     <id_combination>2290</id_combination>
     <quantity>20</quantity>
     <unit_price_impact>0.000000</unit_price_impact>
     <reference>K10100.2B</reference>
     <combination_name>Color: Blue / Size: 2</combination_name>
   </combination>
 </combinations>

Array Output 阵列输出

 array(2) {
   [0]=>
   array(5) {
     ["id_combination"]=>
     string(4) "2289"
     ["quantity"]=>
     string(1) "4"
     ["unit_price_impact"]=>
     string(8) "0.000000"
     ["reference"]=>
     string(9) "K10100.1B"
     ["combination_name"]=>
     string(21) "Color: Blue / Size: 1"
   }
   [1]=>
   array(5) {
     ["id_combination"]=>
     string(4) "2290"
     ["quantity"]=>
      string(2) "20"
     ["unit_price_impact"]=>
     string(8) "0.000000"
     ["reference"]=>
    string(9) "K10100.2B"
     ["combination_name"]=>
     string(21) "Color: Blue / Size: 2"
   }
 }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM