2011-06-23 7 views
1

私は以下のXMLファイルを持っており、各 "ing-div"ノードにタグ "ing"が存在する正確な発生回数を知りたいと思います。それは私が各成分のタイトルのために存在する成分の数を決定するのに役立ちます(すなわち、4つの成分を含むフルーツ、4つの成分を有するスポンジケーキ...)。助言がありますか?phpで特定のノードの子要素の発生数を数えるには?

<?xml version="1.0" encoding="UTF-8"?> 

<recipeml version="0.5"> 
    <recipe> 
    <head> 
     <title>1,000 Calorie-A-Bite Trifle</title> 
     <categories> 
     <cat>Desserts</cat> 
     <cat>Usenet</cat></categories> 
     <yield>1</yield></head> 
    <ingredients> 
     <ing-div> 
     <title>FRUIT</title> 
     <ing> 
      <amt> 
      <qty>3</qty> 
      <unit/></amt> 
      <item>Pears</item></ing> 
     <ing> 
      <amt> 
      <qty>8</qty> 
      <unit>ounces</unit></amt> 
      <item>Raspberries (tinned or fresh)</item></ing> 
     <ing> 
      <amt> 
      <qty>1</qty> 
      <unit/></amt> 
      <item>Passion fruit</item></ing> 
     <ing> 
      <amt> 
      <qty/> 
      <unit/></amt> 
      <item>Dry sherry (1 bottle)</item></ing></ing-div> 
     <ing-div> 
     <title>SPONGE CAKE</title> 
     <ing> 
      <amt> 
      <qty>1/2</qty> 
      <unit>cups</unit></amt> 
      <item>Butter</item></ing> 
     <ing> 
      <amt> 
      <qty>10</qty> 
      <unit>tablespoons</unit></amt> 
      <item>Sugar, castor</item></ing> 
     <ing> 
      <amt> 
      <qty>1 1/4</qty> 
      <unit>cups</unit></amt> 
      <item>Flour, self-raising</item></ing> 
     <ing> 
      <amt> 
      <qty>2</qty> 
      <unit/></amt> 
      <item>Eggs (slightly whisked)</item></ing></ing-div> 
     <ing-div> 
     <title>CUSTARD</title> 
     <ing> 
      <amt> 
      <qty>2</qty> 
      <unit/></amt> 
      <item>Eggs</item></ing> 
     <ing> 
      <amt> 
      <qty>1</qty> 
      <unit>pinch</unit></amt> 
      <item>Salt</item></ing> 
     <ing> 
      <amt> 
      <qty>1</qty> 
      <unit>pinch</unit></amt> 
      <item>Nutmeg</item></ing> 
     <ing> 
      <amt> 
      <qty>10</qty> 
      <unit>ounces</unit></amt> 
      <item>Double cream (or use whipping cream)</item></ing></ing-div> 
     <ing-div> 
     <title>TOPPING</title> 
     <ing> 
      <amt> 
      <qty>10</qty> 
      <unit>ounces</unit></amt> 
      <item>Double cream</item></ing> 
     <ing> 
      <amt> 
      <qty/> 
      <unit/></amt> 
      <item>Roast almonds</item></ing></ing-div></ingredients> 
    <directions> 
     <step> Peel and slice pears, drain raspberries if tinned, and scoop out passion 
    fruit. Place fruit in large trifle bowl and add an ample quantity of 
    sherry. Leave for twenty-four hours to soak in the refrigerator. 

    Preheat oven to 350 degrees F. Cream butter and sugar until light and 
    fluffy. Add eggs and about 2 T of flour and beat. Fold in rest of flour. 
    Bake in 7-inch square tin for 25-30 mins until brown. Let cool. Slice into 
    fingers and arrange on top of fruit. More sherry may be added at this 
    point. 

    Pour one large glass of sherry. Mix eggs and add all ingredients to small 
    bowl. Place bowl in pan of simmering water. Stir continuously with wooden 
    spoon, sipping sherry, until custard thickens. This takes about ten 
    minutes. Pour custard on top of sponge. Chill in fridge. Whip cream until 
    stiff and smooth over top of custard. Arrange almonds decoratively. 

    NOTES: 

    * The title says it all -- This recipe is my own invention. 

    : Difficulty: moderate 
    : Time: 1 hour preparation, 1 day waiting, 10 minutes cooking. 
    : Precision: no need to measure. 

    : Angi Lamb 
    : Department of Computer Science, University of York, UK 
    : ukc!minster!angi 

    : Copyright (C) 1986 USENET Community Trust 

    From Gemini's MASSIVE MealMaster collection at www.synapse.com/~gemini 

</step></directions></recipe></recipeml> 

答えて

1
function unserialize_xml($input, $callback = null, $recurse = false){ 
    $data = ((!$recurse) && is_string($input))? simplexml_load_string($input): $input; 
    if ($data instanceof SimpleXMLElement) $data = (array) $data; 
    if (is_array($data)) foreach ($data as &$item) $item = unserialize_xml($item, $callback, true); 
    return (!is_array($data) && is_callable($callback))? call_user_func($callback, $data): $data; 
} 

この関数にXML文字列を送信し、今で働きやすい配列された結果をチェックします。

foreach($result['recipe'] as $recipe){ 
    echo $recipe['title'].' - '.count($recipe['ingredients']['ing']); 
} 

はEDIT:

ちょうどイテレータを追加あなたのwhileループのために

$xml = new DOMDocument(); 
$xml->load(path/to/file); 
$xpath = new DOMXPath($xml); 
$ingdiv = $xpath->query("/recipeml/recipe/ingredients/ing-div"); 
$length = $ingdiv->length; 
$key=0; 
// iterate over all <ing-div> from last to first 
while($key<$length) { 
// number of <ing> in the specific <ing-div> 
    print $xpath->query("ing", $ingdiv->item($key))->length; 
    $key++ 
} 
+0

レシピタイトルと原料タイトルの表示に問題はありませんが、問題は各成分のタイトルの成分数を知りたいということです。このコードは最後から最初までは動作しますが、最初からは動作しません。助言がありますか? $ xml =新しいDOMDocument(); $ xml-> load(path/to/file); $ xpath =新しいDOMXPath($ xml); $ ingdiv = $ xpath-> query( "/ recipeml/recipe/ingredients/ing-div"); $ length = $ ingdiv-> length; //最初 特定プリント$ xpath->クエリ( "INGの"、$ ingdiv->アイテム($での一方($ length--) {//番号に最後からすべてを反復長さ)) - >長さ; } – T3000

+0

おっと、私の元のコードを忘れていました。あなたも修正しました – Trey

+0

ありがとうございましたTrey、今はうまくいきます!そしてあなたの助けを借りて皆様に感謝します! – T3000

1

DomDocumentには機能がありますJUST FOR THAT

方法getElementsByTagNameの使用方法:DOMXPath::queryでXPathを使用で

$doc = new DOMDocument(); 
$doc->load(<xml>); 
foreach($doc->getElementsByTagName('ing') as $tag) 
{ 
    // to iterate the children 
    foreach($tag->childNodes as $child) 
    { 
     // outputs the xml of the child nodes. Of course, there are any number of 
     // things that you could do instead! 
     echo $doc->saveXML($child); 
    } 
} 
1

ルック。クエリによって生成された結果の数を指定することができます。

php > $doc = new DOMDocument(); 
php > $doc->preserveWhiteSpace = false; 
php > $doc->Load("/tmp/test.xml"); 
php > $xpath = new DOMXPath($doc); 
php > $query = "//ing"; 
php > $ingredients = $xpath->query($query); 
php > echo $ingredients->length; 
int(14) 

必要に応じてXpathクエリを変更する必要がある場合があります。

関連する問題