我试图获得名称,PreviewUrl, Description等的值,当国家名称(例如<Country name="US">
)匹配用户的国家从XML结果如下所示:
<Offers>
<Offer Id="656">
<Name>The Hobbit Android</Name>
<Platform>Android Smartphone & Tablet</Platform>
<DailyCap>63</DailyCap>
<PreviewUrl>https://play.google.com/store/apps/details?id=com.kabam.fortress</PreviewUrl>
<TrackingUrl>http://ads.ad4game.com/www/delivery/dck.php?offerid=656&zoneid=7711</TrackingUrl>
<Description>The battle for Middle-earth has just begun! PLAY FOR FREE and join thousands worldwide to drive ..</Description>
<RestrictedTraffic> Social traffic (facebook, etc), Social traffic (facebook, etc) Email MarketingM, Brand Bidding</RestrictedTraffic>
<Countries>
<Country name="US">
<OptIn>SOI</OptIn><Rate>$3.75</Rate>
<EndDate>2013-09-15 16:47:12</EndDate>
</Country>
</Countries>
</Offer>
</Offers>
当我尝试下面的php代码,我得到所有的节点连接为一个单一的字符串。我怎么能得到名称,PreviewUrl,描述等作为个别字符串时,国家名称匹配?
$xmldoc = new DOMDocument();
$xmldoc->load('http://traffic.ad4game.com/www/admin/offers-api.php');
$xpathvar = new Domxpath($xmldoc);
$queryResult = $xpathvar->query('//Country[@name="US"]/../..');
foreach($queryResult as $result){
echo $result->nodeValue;
}
编辑:至于预期的输出,我希望在获得单个字符串后,我希望它是类似的:
<div id="offer656">
<a href="http://ads.ad4game.com/www/delivery/dck.php?offerid=656&zoneid=7711">
The Hobbit Android</a><br />The battle for Middle-earth has just begun! PLAY FOR FREE and join thousands worldwide to drive ..
</div>
首先,需要遍历xpath查询的所有子元素,因此在末尾添加/*
。
第二,将nodeValue
结果传递到一个数组中,您可以下标单个字符串(即$value[0]
, $value[1]
,…)或在数组上运行foreach
循环:
$xmldoc = new DOMDocument();
$xmldoc->load('http://traffic.ad4game.com/www/admin/offers-api.php');
$xpathvar = new Domxpath($xmldoc);
// ITERATE THROUGH ALL CHILD ELEMENTS
$queryResult = $xpathvar->query('//Country[@name="US"]/../../*');
$value = [];
foreach($queryResult as $result){
// PRINTS ALL NODE VALUES OF XPATH AT ONCE
echo $result->nodeValue;
// PASSES EACH NODE VALUE OF XPATH INTO $VALUE ARRAY
$value[] = $result->nodeValue;
}
// OUTPUT $VALUE ARRAY CONTENTS
var_dump($value);
使用DOMXpath::evaluate()
而不是DOMXPath::query()
。这两个方法可能看起来一样,但是evaluate()
支持返回标量的Xpath表达式。方法的第二个参数是上下文。因此,可以迭代offer
节点并使用其他Xpath表达式来获取详细信息:
$xmldoc = new DOMDocument();
$xmldoc->load('http://traffic.ad4game.com/www/admin/offers-api.php');
$xpath = new Domxpath($xmldoc);
$offers = $xpath->evaluate('//Offer[Countries/Country[@name="US"]]');
foreach($offers as $offer){
var_dump(
[
'name' => $xpath->evaluate('string(Name)', $offer),
'previewUrl' => $xpath->evaluate('string(PreviewUrl)', $offer)
]
);
}