使用PHP从XML Feed中隔离单个项目

时间:2010-03-05 12:12:04

标签: php xml simplexml

嗨,谢谢你。

我试图通过以下链接获得1 GBP = USD之后的括号中的值,我该如何使用SimpleXML?

http://www.sloomedia.com/currency/feeds/GBP.xml

谢谢, 本。

2 个答案:

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