-1

こんにちは、XML 要素の解析を手伝ってくれませんか。XML から値を取得して csv ファイルに書き込もうとしています。これまでのところ、すべてを読み取ることができますが、XML の内部要素がわかりにくいので、これを解決する方法を教えていただければ幸いです。 ?

私はXMLを持っています:

          <Product>
            <ProductCode>51629AE</ProductCode>
            <Vendor>HEWLETT PACKARD</Vendor>
            <ProductType>Printer Ink Cartridge</ProductType>
            <ProductCategory>Printeri</ProductCategory>
            <ProductDescription>Ink Cartridge HEWLETT PACKARD Black 40ml for HP DJ600/660/670/680/690/DW 600/660/680/690/OJ500/600/700/PSC-370/380/FAX 910 (650pages)</ProductDescription>
            <Image>https://www.it4profit.com/catalogimg/wic/1/51629AE</Image>
            <ProductCard>https://content.it4profit.com/itshop/itemcard_cs.jsp?ITEM=50409104044691930&amp;THEME=asbis&amp;LANG=lv</ProductCard>
            <AttrList>
              <element Name="Ink Color" Value="Black"/>
              <element Name="Ink Capacity" Value="40 ml"/>
              <element Name="Compliance" Value="HP DJ600/660/670/680/690/DW 600/660/680/690/OJ500/600/700/PSC-370/380/FAX 910"/>
              <element Name="Estimated Maximum Cartridge Life" Value="650 pages"/>
              <element Name="Number of Ink Colors" Value="1"/>
              <element Name="Typical Page Coverage" Value="5 %"/>
              <element Name="Warranty Products returnable" Value="Yes"/>
              <element Name="Pack Weight Brutto (kg)" Value="0.1 kg"/>
              <element Name="Pieces in pack" Value="1"/>
            </AttrList>
            <MarketingInfo>
              <element>The HP no. 29 black inkjet print cartridge is ideal for business or home users who want professional-quality printouts. The HP no. 29 is a 600-dpi black pigmented inkjet print cartridge that delivers sharp, professional quality documents and is made to work with HP colour inks for maximum results. Output is consistently crisp and clean on almost any plain paper. The print cartridge contains genuine HP ink that provides quality and reliability every time you print.</element>
            </MarketingInfo>
            <Images>
              <Image>https://content.it4profit.com/pimg/s/resize/160x160x160x160/2783330.jpg</Image>
            </Images>
          </Product>

このデータは、そこにあるものをすべて取得してcsvに書き込む必要がある単なる例です。この部分は私に問題を引き起こしています。この XML ファイルからこのデータを抽出する方法がわかりません このスクリプトが壊れると、それが問題になり、このデータを取得する際に問題が発生します。

            <AttrList>
              <element Name="Ink Color" Value="Black"/>
              <element Name="Ink Capacity" Value="40 ml"/>
              <element Name="Compliance" Value="HP DJ600/660/670/680/690/DW 600/660/680/690/OJ500/600/700/PSC-370/380/FAX 910"/>
              <element Name="Estimated Maximum Cartridge Life" Value="650 pages"/>
              <element Name="Number of Ink Colors" Value="1"/>
              <element Name="Typical Page Coverage" Value="5 %"/>
              <element Name="Warranty Products returnable" Value="Yes"/>
              <element Name="Pack Weight Brutto (kg)" Value="0.1 kg"/>
              <element Name="Pieces in pack" Value="1"/>
            </AttrList>

その名前の名前と値を保存する必要があります

これは機能しますが、要素では機能しない私のコードです。それが欠落しており、このコードでそれを実装する方法を理解する必要があります:

    function parsing_xml($supplier_name,$xml_url,$opsi='string'){
        $xml = simplexml_load_file(utf8_encode($xml_url), 'SimpleXMLElement', LIBXML_NOCDATA);
        //$xml = simplexml_load_file($xml_url, 'SimpleXMLElement', LIBXML_NOCDATA);
        if(!$xml){echo "xml $xml_url not loaded.";exit;}
        $i=0;
        $string="";
        foreach($xml as $k=>$v){
            $b="";
            if($i==0){
                foreach($v as $k1=>$v1){
                    $head[]=$k1;
                }
                array_push($head,"ime_proizvoda","meta_description","meta_tag","tax","supplier","quantity","price","Referenca","tezina","opis_link");
                //array_push($head,"dugi_opis","ime_proizvoda","meta_description","meta_tag","tax","supplier","quantity","price","Referenca","tezina");
                foreach($head as $k4=>$v4){
                    $b.= "$v4".DELIMITER;
                }
            }//echo $xml->$k->BrojArtikla."=>".$xml->$k->Image."<pre>".print_r($head,1)."</pre>";
            foreach($head as $k3=>$v3){
                if($v3=='meta_description'){$v3='Naziv';}

                if(empty($v->$v3) or $v->$v3=="" or !isset($v->$v3)){
                    $v->$v3="|||";
                }
                if($v3=='tax'){
                    $b.=TAX.DELIMITER;
                    $v->$v3=TAX;
                }elseif($v3=='supplier'){
                    $b.=$supplier_name.DELIMITER;
                    $v->$v3=$supplier_name;
                }elseif($v3=='quantity'){
                    if($v->Stanje=="+"){
                    //if($v->Status=='Raspoloživo'){
                        $b.="4".DELIMITER;
                        $v->$v3=2;
                    }else{
                        $b.="0".DELIMITER;
                        $v->$v3=0;
                    }
                }elseif($v3=='Cijena'){
                    //$b.=(string) floatval($v->$v3).DELIMITER;
                    //$v->$v3=(string) floatval($v->$v3);

                    $b.=str_replace(',', '.', (string) $v->$v3).DELIMITER;
                    $v->$v3=str_replace(',', '.', (string) $v->$v3);



                    //$b.= str_replace(',', '.', floatval($v->$v3)).DELIMITER;
                    //$v->$v3= str_replace(',', '.', floatval($v->$v3));
                }elseif($v3=='ListPrice'){
                    $b.= (string) floatval($v->$v3).DELIMITER;
                    $v->$v3= (string) floatval($v->$v3);
                }elseif($v3=='Rabat'){
                    $b.= (string) floatval($v->$v3).DELIMITER;
                    $v->$v3= (string) floatval($v->$v3);
                }elseif($v3=='price'){
                    $b.= (string) floatval($v->Cijena)*MARZA.DELIMITER;
                    $v->$v3=(string) floatval($v->Cijena)*MARZA;
                }


                elseif($v3=='meta_tag'){
                    $b.=$v->$v->Brand.DELIMITER;
                    $v->$v3=$v->$v->Brand;
                }

                //ovo za ime da makne cudne znakove

                 elseif($v3=='ime_proizvoda'){


                 $b.=(string) preg_replace('/[%&#\\/-]/', '', $v->Naziv).DELIMITER;
                 //
                 //
                 //
                  $v->$v3=(string) preg_replace('/[%&#\\/-]/', '', $v->Naziv);


                    }

                    //ovo za referencu makni prva 4 znaka
                 elseif($v3=='Referenca'){

                 $b.=substr($v->Sifra, 4).DELIMITER;



                   $v->$v3=substr($v->Sifra, 4);


                    }

                      //ovo opis sa linkom
                 elseif($v3=='opis_link'){

                 $b.=$v->$v->Opis."<br/>Link na proizvod: <p><a href=$v->Link>$v->Link</a></p>".DELIMITER;
                 $v->$v3=$v->Opis."<br/>Link na proizvod: <p><a href=$v->Link>$v->Link</a></p>";



                    }

                    elseif($v3=='tezina'){

                 $b.=str_replace(',', '.', $v->Bruto_tezina_kg).DELIMITER;



                   $v->$v3=str_replace(',', '.', $v->Bruto_tezina_kg);;


                    }

                else{
                    $b.=$v->$v3.DELIMITER;
                }
            }
            $supplier_item[(string)$v->Sifra]=$v;
            $b=substr($b,0,-1);
            $b=str_replace("'","\'",$b);
            $b=str_replace('"','\"',$b);
            $b=str_replace("\n"," ",$b);

            $i++;
            $string.="\n$b";

        }
4

1 に答える 1

1

で simpleXmlElement の属性を取得できるはずです$element->attributes()。これは、例では、属性名と値を含む連想配列を返します。

"Name" => "Ink Color"
"Value" => "Black"

SimpleXmlElementのドキュメントについては、http://php.net/manual/en/simplexmlelement.attributes.php を参照してください。

于 2013-01-07T10:45:58.713 に答える