2017-01-05 37 views
1

我需要获取数据的xml文件很大,并且有很多儿童内在的孩子。我需要查询的XML如图所示,并且它有更多的Ref儿童。 xml structurephp xpath with dom如何编写较短的查询

我需要获取具有正确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; 
} 

我tryed它短,但我不能让在[这样]选择元素:

$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

你的第二个表达式(在循环内部)不依赖于上下文。位置路径开始处的斜杠(/)意味着它是绝对的,它从文档节点开始。 []是过滤来自先前位置路径的结果的条件。它们本身是完整的Xpath表达式。所以不,并不总是可以缩短Xpath表达式。但是在您的情况下,您可以直接使用DOMXpath::evaluate()作为列表获取公司节点,然后直接使用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

确定它适用于“参考[谁='456'] /日期”。谢谢! –