使用PHP解析XML标记

时间:2011-08-03 04:04:48

标签: php xml xml-parsing

我有一个XML文档,如下所示:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<smses count="1992">
  <sms protocol="0" address="5558675309" date="1309444177931" type="1" subject="null" body="text message" toa="0" sc_toa="0" service_center="null" read="1" status="-1" locked="0" />
</smses>

我想提取每条<sms>行的地址,日期和正文,大约有8000行。我不确定最好的方法,所以如果有人能指出我正确的方向,我会很感激。不需要特定的代码,只需要方向。我很难过。

2 个答案:

答案 0 :(得分:2)

$dom = new DOMDOcument();

// Load your XML as a string
$dom->loadXML($s);

// Create new XPath object
$xpath = new DOMXpath($dom);

// Query for Account elments inside NewDataSet elemts inside string elements
$result = $xpath->query("/smses");

// Note there are many ways to query XPath using this syntax

// Iterate over the results
foreach($result as $node)
{
    // Obtains item for sms tags here
}

答案 1 :(得分:2)

您可以使用PHP的SimpleXML扩展名来解析此问题。有关简介,请参阅"Basic SimpleXML usage"

以下是一些让您入门的代码(array_map需要PHP&gt; = 5.3):

$smses = new SimpleXMLElement($xml_str);
$smses_parsed = array_map(function($sms_el) {
        return array('address' => (string)$sms_el['address'],
            'date' => (int)$sms_el['date'],
            'body' => (string)$sms_el['body']);
    }, $smses);

print_r($smses_parsed[0]); /* => array("address" => "5558675309",
                                       "date" => 1309444177931,
                                       "body" => "text message") */

一个注意事项:SimpleXML是一个严格的解析器。如果您的XML有些格式错误,那么DOMDocument可能会更幸运。 (但是,考虑到您发布的简单文档结构,我不希望这种情况发生在这里。)