嗨,谢谢你。
我试图通过以下链接获得1 GBP = USD之后的括号中的值,我该如何使用SimpleXML?
http://www.sloomedia.com/currency/feeds/GBP.xml
谢谢, 本。
答案 0 :(得分:1)
您可以尝试使用xpath:
$xml = new SimpleXMLElement($string);
/* On cherche <item><title> */
$result = $xml->xpath('/item/title');
while(list( , $node) = each($result)) {
$matches = array();
preg_match('/\((.*)\)/', $node, $matches);
//do wathever you need with result
//echo $matches[1];
}
我没有快速编写正则表达式,你可以找到更好的东西或使用substr,因为'1GBP = XXX'的长度在你的文件中是不变的
答案 1 :(得分:1)
为了“隔离”(或者更确切地说,选择)正确的节点,您可以使用XPath函数starts-with()
。
选择节点后,您仍然需要解析其内容。为此,您可以在PHP中使用任何类型的字符串操作函数。
$rss = simplexml_load_file('http://www.sloomedia.com/currency/feeds/GBP.xml');
$nodes = $rss->xpath('//item[starts-with(title, "1 GBP = USD")]');
if (empty($nodes))
{
die('No GBP = USD nodes');
}
// Now you got the right node in $nodes[0], you just have to extract the value in parentheses
// The simple way -- 13 is the number of characters in "1 GBP = USD ("
$usd = substr($nodes[0]->title, 13, -1);
// The flexible way
if (!preg_match('#\\(([0-9]+\\.[0-9]+)\\)#', $nodes[0]->title, $m))
{
die('Could not parse the value');
}
$usd = $m[1];
// If you want to parse every item
foreach ($rss->channel->item as $item)
{
if (!preg_match('#1 ([A-Z]+) = ([A-Z]+) \\(([0-9]+\\.[0-9]+)\\)#', $item->title, $m))
{
echo 'Could not parse ', $item->title, "\n";
continue;
}
echo '1 ', $m[1], ' = ', $m[3], ' ', $m[2], "\n";
}