Получение данных из массива simpleXML
Уважаемым читателям
Я пытаюсь получить данные из массива 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";
}
2 ответа
Вы запрашиваете элементы элемента на корневом уровне (/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";
}
В ответ на ваш комментарий ниже это: Чтобы захватить первый 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...
}
Ваш XML должен быть очищен в первую очередь. Теги Somme закрываются дважды, некоторые никогда не закрываются... Вы не сможете проанализировать этот вид искаженного XML.