這是很容易使用XPath完成:
$doc = new DOMDocument();
$doc->load('my_file.xml', LIBXML_PARSEHUGE);
$xp = new DOMXPath($doc);
$count = $xp->evaluate('count(//Item)');
XPath表達式返回所有Item
標籤文檔中的數量。
LIBXML_PARSEHUGE
選項僅影響深度,實體遞歸和文本節點大小的內部限制。但是,DOM解析器會將整個文檔加載到內存中。
對於真大文件,則使用SAX parser,其每片上依次XML的操作(且因此加載到存儲器中的文件的一小部分):
$counter = 0;
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, function ($parser, $name) use (&$counter) {
if ($name === 'ITEM') {
$counter++;
}
}, null);
if (!($fp = fopen('my_file.xml', 'r'))) {
die('Could not open XML input');
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
我最終使用'DOMDocument'爲現在。但SAX解析器對於大文件來說絕對是更好的選擇,因爲它是基於事件的解析器而不是基於樹的。 –