2012-05-11 95 views
1

致尊敬的讀者從simpleXML數組中獲取數據

我試圖從pubmed中獲取的xml數據數組中檢索數據。該陣列是這樣的:

<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> 

數組是可變長,但總會有初始結構是這樣的:

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

的數據,我特別需要的是這個

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

下面的代碼是我正在嘗試,它不起作用。有誰能夠幫助我?

$pmid_all=file_get_contents($url_id); 

$p=simplexml_load_string($pmid_all); 

$result = $p->xpath('/item'); 

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

「不起作用」,如:xpath查詢中的「no results」?一個錯誤?請儘量更精確。 – ccKep

+0

xml無效 –

回答

3

您正在查詢根級別的項目元素(/item)。嘗試用/summa/docs/item替換您的xpath查詢。

編輯:您的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"; 
} 

在回答下面你對此有何評論:搶得頭Item - 元素在每個DocS - 元素:

$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標籤被關閉兩次,有些從未關閉......你不會有能力解析這種畸形的XML。