2016-07-01 76 views
0

我是PHP和XML的初学者。从XML节点获取数据

我有一个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> 

而且我希望得到一个数组,如下所述:

$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 

我想以同样“id_combination加入数据'节点,然后使用PHP进行处理。

我试图使用“foreach”循环,“array_unique”,“implode”等,但无法取得任何成功。

我希望任何人都能帮助我直接得到建议的代码。

回答

0

我只是做了以下更改的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); 
+0

谢谢您的回答。我实际上帮助关于php代码本身做出必要的数组。 :) – Gokmen

+0

是的....这创建一个数组'(xx)$ xmlobject'看看代码的下半部分,这样做你需要对你的xml进行一些修改 –

+0

我简直不知道如何组合和阵列节点使用相同的'id_combination':),并请求帮助编写自己的示例代码。例如:$ id_combination => 2289 $ reference => K10100.1B $ combination_name =>颜色:蓝色/大小:1 $ quantity => 4 – Gokmen

0

在考虑一个XSLT的解决方案,因为这是在XSLT 1.0 Muenchian Method使用的典型需求通过各种密钥对节点进行分组。作为信息,XSLT是一种特殊用途的语言,用于转换XML文件并像大多数通用语言一样,PHP维护一个XSLT处理器。

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脚本

// 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); 

转化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(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" 
    } 
} 
+0

谢谢你的解决方案!我会尽快尝试。 – Gokmen