1

尊敬される読者へ

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";
}
4

2 に答える 2

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";
}

この下のコメントへの回答:ItemDocS-Elementの最初の-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...
}
于 2012-05-11T14:40:27.930 に答える
0

最初にXMLをクリーンアップする必要があります。Sommeタグは2回閉じられますが、閉じられないものもあります...この種の不正な形式のXMLを解析することはできません。

于 2012-05-11T14:40:29.163 に答える