2012-05-11 1 views
1

からデータを取得します。は、私はPubMedのから取ったデータのXML列からデータを取得しようとしている尊敬読者</p> <p>へのSimpleXML配列

<summa> 
    <DocS> 
     <Id>1</Id> 
     <Item Name="PubDate" Type="Date">1999</Item> 
     <Item Name="EPubDate" Type="Date"/> //<- notice the open tag 
     <Item Name="Source" Type="String">source a</Item> 
     <Item Name="AuthorList" Type="List"> 
      <Item Name="Author" Type="String">a</Item> 
      <Item Name="Author" Type="String">b</Item> 
     </Item> 
    </DocS> 
    <DocS> 
     <Id>2</Id> 
     <Item Name="PubDate" Type="Date">1781</Item> 
     <Item Name="EPubDate" Type="Date"/></Item> //<- notice the closed tag 
     <Item Name="Source" Type="String">source a</Item> 
     <Item Name="AuthorList" Type="List"> 
      <Item Name="Author" Type="String">a</Item> 
      <Item Name="Author" Type="String">b</Item> 
      <Item Name="Author" Type="String">c</Item> 
      <Item Name="Author" Type="String">d</Item> 
     </Item> 
    </DocS> 
</summa> 

配列が可変の長さであるが、常にこのような初期構造があります:私は、特に必要なデータがこの

<Item Name="PubDate" Type="Date">data needed </Item>" 

ある

<summa> 
    <DocS> 
     <Id>1</Id> 
     <Item Name="PubDate" Type="Date">1999</Item> 

を配列は次のようになります以下のコードは私が試しているもので、動作しません。誰か助けてくれますか?

+0

xpathクエリの「結果がありません」のように「動作しません」?エラー?より正確にしてください。 – ccKep

+0

xmlが無効です –

答えて

3

ルートレベル(/item)のアイテム要素を照会しています。 xpathクエリを/summa/docs/itemに置き換えてみてください。

編集:あなたのXMLも <Item Name="EPubDate" Type="Date"/></Item>

不正な形式であるのどちらか/または</Item>を削除します。

$pmid_all=file_get_contents("foo.xml"); 
$p=simplexml_load_string($pmid_all); 
$result = $p->xpath('/summa/DocS/Item'); 

while(list(, $node) = each($result)) { 
    echo 'item: ',$node,"\n"; 
} 

をこの下のコメントへの答えでは:各DocS -elementの最初のItem -elementをつかむために:

$pmid_all=file_get_contents("foo.xml"); 

$p=simplexml_load_string($pmid_all); 
$result = $p->xpath('/summa/DocS'); 

while(list(, $node) = each($result)) { 
    $items = $node->xpath("Item"); 
    echo 'item: ',$items[0],"\n"; // $item[0] is the first Item found, $item[1] the 2nd, etc... 
} 
+0

+1確かに@ccKepによれば、反復処理中でポインタがそのレベルにない限り、アイテムへのフルパスを指定する必要があります。 – EmmanuelG

+0

恐ろしい! XMLを整理しました。私は今すべて ''を返しています。もし私が ''に最初の ''を取得したいのであれば、どうすればいいでしょうか? – user1378824

+0

'/ summa/DocS'を見て、ループなしでItem要素をつかんでください。完全な例が必要な場合は、この回答を編集/追加します。編集:完全な例で答えを編集しました。 – ccKep

0

あなたのXMLこれは私のために働いた、という固定した後

最初に清掃する必要があります。 Sommeのタグは2回閉じられ、決して閉じられないものもあります。この種の不正なXMLを解析することはできません。

関連する問題