2017-01-05 3 views
1

私がデータを取得する必要があるxmlファイルは大きく、子どもの中にたくさんの内部の子供がいます。私が照会する必要のあるXMLは、写真のように見え、会社内には多くのRefの子供がいます。 xml structurephp xpathで短いquerysを書く方法

正しいInfo-> IDを持つ会社ノードを取得する必要があります。そのノードには3つのRefノードがあり、正しいWhoを持つノードからDateを取得する必要があります。

私はこの本醜いコードで作業しました:

$query_pod = "//Seller/Company/Info/ID[ID = 'IV'] | //Seller/Company/Ref/Who[Who = 'VA'] | //Seller/Company/Ref/Date"; 
foreach ($xpath->query($query_pod) as $pod) 
{ 
    $pod_dates = $xpath->query("//Seller/Company/Ref/Who[Who = 'VA'] | //Seller/Company/Ref/Date", $pod); 
    $pod_date = $pod_dates->item(0)->nodeValue; 
} 

私は短いそれをしようと試みたが、私はこのような[]内のselect要素を取得カント:

$query_pod = "//Seller/Company/Info[ID = 'IV']"; 
foreach ($xpath->query($query_pod) as $pod) 
{ 
    $pod_dates = $xpath->query("//Seller/Company/Ref/Date[Who = 'VA'], $pod); 
    $pod_date = $pod_dates->item(0)->nodeValue; 
} 

を誰かが助けることはできますか?私はxpathを初めて使う人です。

+0

$ pod_dates = $ xpath->クエリ(「//出品者/会社/ Ref/Date [Who = 'VA'] "、$ pod);私の実際のコードに誤りがないか、間違いを書きます。 –

答えて

0

2番目の式(ループ内のon)はコンテキストに依存しません。ロケーションパスの先頭にあるスラッシュ(/)は、絶対パスであることを意味し、ドキュメントノードから始まります。 []は、前のロケーションパスから結果をフィルタリングする条件です。それらは完全なXpath表現です。 Xpath式を短縮することは必ずしも可能ではありません。しかし、あなたのケースでは、会社ノードをリストとして取得し、次に詳細をDOMXpath::evaluate()を使用して取得できます。 DOMXpath::query()とは異なり、DOMXpath::evaluate()はノードリストまたはスカラー値を返すことができます。それは表現に依存します。

$xml = <<<'XML' 
<Seller> 
    <Company> 
    <Info> 
     <ID>123</ID> 
     <Address>Some street, somewhere</Address> 
    </Info> 
    <Ref> 
     <Who>456</Who> 
     <Date>2017-01-05T01:59Z</Date> 
    </Ref> 
    </Company> 
</Seller> 
XML; 

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('/Seller/Company[Info/ID = "123"]') as $company) { 
    var_dump(
    $xpath->evaluate('string(Info/ID)', $company), 
    $xpath->evaluate('string(Ref/Date)', $company) 
); 
} 

出力:

string(3) "123" 
string(17) "2017-01-05T01:59Z" 

あなたは単一の値のみが必要な場合は、あなたがそれを直接取り出すことができます。

var_dump(
    $xpath->evaluate('string(/Seller/Company[Info/ID = "123"]/Ref/Date)') 
); 
+0

これは多くの仕事をテストしたので、うまくいきませんでした。それは私の質問にはあたらない。私のXMLには1つ以上のRefがあり、正しい日付は "456"の誰かにあります。だから、それは( "Ref [Who = '456']/Date)のようなものでなければなりません。しかし、私の問題は、foreachループに入ることさえないということです。 –

+0

これは「Ref [Who = '456']/Date」で動作します。ありがとうございました! –

関連する問題