2010-12-19 4 views
0

私はここにクレイジーに行くよ...再び!xpathなしでsimplexmlobjectから文字列を取得

私はこのsimplexmlのファイルがあります... 2010-07-08 次のコードは動作します:私は、この特定の方法で "DateCreated" を持ちたい

SimpleXMLElement Object 
(
    [PubmedArticle] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [MedlineCitation] => SimpleXMLElement Object 
         (
          [@attributes] => Array 
           (
            [Owner] => NLM 
            [Status] => In-Process 
           ) 

          [PMID] => 20538400 
          [DateCreated] => SimpleXMLElement Object 
           (
            [Year] => 2010 
            [Month] => 07 
            [Day] => 08 
           ) 

          [Article] => SimpleXMLElement Object 
           (
            [@attributes] => Array 
             (
              [PubModel] => Print-Electronic 
             ) 
etc..... 

foreach ($xml->xpath('//MedlineCitation') as $MedlineCitation) 
{ 

    foreach ($MedlineCitation->DateCreated as $date) 
    { 
      foreach ($date as $ymd) 
      { 
      $datecreated .= $ymd . "-"; 
      } 
    $datecreated = substr($datecreated, 0, -1); 
    echo $datecreated; 
    $datecreated = ""; 
    } 
} 

出力:2010-07-08 しかし...私は、XPathでは動作しません。この「foreachループ」のコードの別の平和を持っている必要がありますので、私は、XPathのなしでそれをしたい...

このコードは動作しませんしません....:

foreach ($xml->PubmedArticle as $MedlineCitation) 
{ 
     foreach ($MedlineCitation->DateCreated as $date) 
     { 
      foreach ($date as $ymd) 
      { 
      $datecreated .= $ymd . "-"; 
      } 
     $datecreated = substr($datecreated, 0, -1); 
     echo $datecreated; 
     $datecreated = ""; 
     } 
} 

そして、これもない鍋を行い...:

foreach ($xml->PubmedArticle as $MedlineCitation) 
    { 
    $datecreated = ""; 

    $datecreated = $MedlineCitation->DateCreated->Year; 
    $datecreated = $datecreated . "-" . $MedlineCitation->DateCreated->Month; 
    $datecreated = $datecreated . "-" . $MedlineCitation->DateCreated->Day; 
    echo $datecreated; 
    } 

よろしく! タイス

答えて

1

SimpleXMLでXML構造がどのようにアクセスされているか少し混乱しているようです。あなたの日付を取得するには、各MedlineCitation以上のループは、各PubmedArticle内の可能性のような:

// Loop over each <PubmedArticle> 
foreach ($xml->PubmedArticle as $article) 
{ 
    // Loop over each <MedlineCitation> within this <PubmedArticle> 
    foreach ($article->MedlineCitation as $citation) { 
     // Get formatted created date 
     $date_created = sprintf(
      "%04d-%02d-%02d", 
      $citation->DateCreated->Year, 
      $citation->DateCreated->Month, 
      $citation->DateCreated->Day 
     ); 
     echo $date_created . PHP_EOL; 
    } 
} 

しか1 MedlineCitationPubmedArticle内がある場合は、内側のループが不要であり、あなたが行うことができます:

// Loop over each <PubmedArticle> 
foreach ($xml->PubmedArticle as $article) 
{ 
    // Use the <MedlineCitation> within this <PubmedArticle> 
    $citation = $article->MedlineCitation; 
    // Get formatted created date 
    $date_created = sprintf(
     "%04d-%02d-%02d", 
     $citation->DateCreated->Year, 
     $citation->DateCreated->Month, 
     $citation->DateCreated->Day 
    ); 
    echo $date_created . PHP_EOL; 
} 
+0

よろしくお願いいたします。これが解決策です!私は構造の1つのレベルを逃した! – Thijs

0

あなたは、このスニペット

//

$ YY = $ XML-> DateCreated->年を試してみてください$のXMLにXMLファイルの内容をロードしていると仮定します。 $ mm = $ xml-> DateCreated-> Month; $ dd = $ xml-> DateCreated-> Day;

$ datecreated = $ yy .'- '。$ mm .'-'。$ dd; // yyyy-mm-dd

echo $ datecreated;

// このヘルプが必要です。

+0

それは動作しません---------- – Thijs

+0

これはforeachループ内の全パスを使用すると動作します... $ MedlineCitationが満たされないのが好きなように見えますか? : "foreach($ xml-> PubmedArticle $ MedlineCitation)"ループ...? – Thijs

関連する問題