2011-12-23 14 views
0
<?xml version="1.0"?> 
<order> 
<order_businessid>2</order_businessid> 
<order_categoryid>3</order_categoryid> 

<product_id>1</product_id> 
<product_name1>CreamCheese Cake</product_name1> 
<product_price1>4.10</product_price1> 
<product_Qty1>1</product_Qty1> 

<product_id>3</product_id> 
<product_name2>Gujarati unlimited</product_name2> 
<product_price2>50.00</product_price2> 
<product_Qty2>1</product_Qty2> 

<product_id>5</product_id> 
<product_name3>Cheese French Frish</product_name3> 
<product_price3>4.10</product_price3> 
<product_Qty3>1</product_Qty3> 
</order> 

この構造をどのように読むことができますか?PHPでこのXML構造を読む

私はPHPで出力したいと思います:

ProduktID 1, has name CreamCheese Cake and it's price is 4.10 
ProduktID 3, has name Gujarati unlimited and it's price is 50.00 

など..

すべての情報は、一つの要素の中にあった場合、私はこれを行う方法を知って、要素を通じ、私はするのと同じループ、属性と出力を取得します。正直

しかし、これで私は全然知らないので、あなたは私を助けることができると思います。..

+0

このXML形式を好む習慣XML。同じ名前とグループ要素を一緒に使用します。たとえば、product_name3はしないでください。名前を使用し、すべての商品データを1つの商品要素の下に要素/属性としてグループ化するだけです。 –

+0

このようなXMLは、DOMメソッドではなく、文字列でXMLを作成する開発者に由来します。それに<>タグが含まれているだけでXMLにならないからです。 –

答えて

2

XMLの構造は非常に貧弱です。正しい構造で注文した各製品を使用すると、この作業が非常に簡単になります。

しかし、これは(SimpleXMLを使用して)動作します。

$myxml = '<?xml version="1.0"?> 
<order> 
<order_businessid>2</order_businessid> 
<order_categoryid>3</order_categoryid> 

<product_id>1</product_id> 
<product_name1>CreamCheese Cake</product_name1> 
<product_price1>4.10</product_price1> 
<product_Qty1>1</product_Qty1> 

<product_id>3</product_id> 
<product_name2>Gujarati unlimited</product_name2> 
<product_price2>50.00</product_price2> 
<product_Qty2>1</product_Qty2> 

<product_id>5</product_id> 
<product_name3>Cheese French Frish</product_name3> 
<product_price3>4.10</product_price3> 
<product_Qty3>1</product_Qty3> 
</order>'; 


$xml = simplexml_load_string($myxml); 
$count=1; 
foreach ($xml->product_id as $prod) { 
$pn = $xml->xpath('/order/product_name'.$count); 
$price = $xml->xpath('/order/product_price'.$count); 
$pq = $xml->xpath('/order/product_Qty'.$count); 

echo "ProduktID $prod, has name $pn[0] and it's price is $price[0] and exists $pq[0] time(s)".PHP_EOL; 
$count++; 
} 

の作業例:http://codepad.org/R00NJhOr

0

EHM ...?これをxml構造体と呼ぶ開発者がいますか? xD

このような扱い方にはいくつかの方法があります。私は正規表現を好む:これはpreg_match_allで動作するはず

/.*?<product_id>(.*?)<\/product_id>.*?<product_name\d*>(.*?)<\/product_name\d*>.*?<product_price\d*>(.*?)<\/product_price\d*>.*?<product_Qty\d*>(.*?)<\/product_Qty\d*>.*/s 

ProduktID $1, has name $2 and it's price is $3 and exists $4 time(s).\n 

が、それは未テストです:

この1つはあなたの要件に合う必要があります!

よろしくお願いいたします。ここで

+0

私はあなたに同意しますが、私はそれについて何もしません。 XML構造は、アプリケーション開発者が作成しました – Karem

0

DOMDocumentを使用してソリューションです:もちろん

$doc = new DOMDocument(); 

$doc->load("order.xml"); 

$productList = array(); 

foreach($doc->documentElement->childNodes as $node) { 
    if($node->tagName == "product_id") { 
     $productList[] = array(
      "id" => $node->textContent, 
     ); 
    } 

    if(preg_match("/product_([A-Za-z_]+)(\d+)/", $node->tagName, $m)) { 
     $productList[$m[2] - 1][$m[1]] = $node->textContent; 
    } 
} 

foreach($productList as $product) { 
    echo "ProduktID ", $product["id"] 
     , ", has name ", $product["name"] 
     , " and it's price is ", $product["price"] 
     , " with quantity ", $product["Qty"] 
     , "\n"; 
} 

、そのXMLは、(私はアーミンの感情@共有)本当に奇妙に見えます。それは、それらの派手なXMLツール/ライブラリの1つではなく、文字列連結または単にechoでレンダリングすることで、 "手作り"のように見えます。

1

これはあなたの問題を解決しますが、私はかなりお粗末だ

$xmlStr = '<?xml version="1.0"?> 
<order> 
<order_businessid>2</order_businessid> 
<order_categoryid>3</order_categoryid> 

<product_id>1</product_id> 
<product_name1>CreamCheese Cake</product_name1> 
<product_price1>4.10</product_price1> 
<product_Qty1>1</product_Qty1> 

<product_id>3</product_id> 
<product_name2>Gujarati unlimited</product_name2> 
<product_price2>50.00</product_price2> 
<product_Qty2>1</product_Qty2> 

<product_id>5</product_id> 
<product_name3>Cheese French Frish</product_name3> 
<product_price3>4.10</product_price3> 
<product_Qty3>1</product_Qty3> 
</order>'; 

$xml = simplexml_load_string($xmlStr); 

$pid = $pnam = $ppric = ''; 
foreach($xml as $ky=>$node) { 
    $pid = ($ky == 'product_id') ? $node[0] : $pid ; 
    $pnam = (strpos($ky, 'product_name') === 0) ? $node[0] : $pnam; 
    $ppric = (strpos($ky, 'product_price') === 0) ? $node[0] : $ppric; 

    if(strpos($ky, 'product_price') === 0) { 
     echo "product id $pid has name $pnam and its price is $ppric <br>"; 
    } 
}