2016-07-01 12 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に次の変更を行なったし、新しいコードを追加して見ており、これは使用XSLT 1.0でMuenchian Methodの典型的な必要性があるとして、XSLTソリューションを考えてみましょう私の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

はい....これは、配列 '(配列)$ xmlobject'を作成して、コードの下部を見て、あなたのXMLにいくつかの変更が必要です。 –

+0

私は単純にどのように結合してノードを配列するのか分かりません同じ 'id_combination' :)を使用して、それを行うためのサンプルコード自体を書くよう助けてください。いくつかの組み合わせは同じid_combinationを持ち、異なるデータを続けています。たとえば、$ id_combination => 2289 $ reference => K10100.1B $ combination_name =>色:Blue/Size:1 $ quantity => 4 – Gokmen

0

に取り組みましたさまざまなキーでノードをグループ化します。情報として、XSLTは、XMLファイルを変換するために設計された特殊目的言語であり、最も汎用的な言語のように、PHPはXSLTプロセッサを維持しています。

XSLTスクリプト

<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> 
(の.xslは、以下のスクリプトでロードするとして保存)

アレイ出力

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

関連する問題