Unë e di se si të marr shtegun e nyjes përmes DODocument:
$dom = new DOMDocument;
$dom->loadXML('<fruits><fruit><name>Apple</name><name>Banana</name></fruit></fruits>');
foreach($dom->getElementsByTagName('*') as $node){
// e.g. $node->getNodePath();
};
Pyetja ime është: Më duhet të marr të gjitha nyjet + numrin e herëve që ndodh në një skedar dhe kam skedarë SHUMË të mëdhenj.
Një skedar shembull është ky:
<products>
<product>
<properties>
<property></property>
<property></property>
</properties>
</product>
...
</products>
- nyja
<products>
shfaqet 1 herë (sepse është nyja rrënjë) - nyja
<product>
shfaqet 60 000 herë - nyja
<property>
shfaqet 120 000 herë (2 herë për produkt)
PARALAJMËRIM: sepse çdo skedar është i ndryshëm, unë NUK e kam emrin e nyjës rrënjë! në këtë shembull, është <products>
por mund të jetë diçka tjetër). Për të marrë emrin e nyjës rrënjë, unë përdor këtë kod:
$simpleXML = simplexml_load_file(<-- filename goes here -->);
$root = $simpleXML->getName();
Kam gjetur këtë depo: https://github.com/dkrnl/SimpleXMLReader
Pastaj përdor këtë kod:
$reader = new SimpleXMLReader;
$reader->open(<!-- filename goes here -->);
$reader->registerCallback($root,function($reader){
$xml = $reader->expandDomDocument();
foreach($xml->childNodes as $child){
list($nodes,$counter) = getChildrenOfAllNodes($child,$nodes,$counter);
};
};
$reader->parse();
$reader->close();
Dhe ky është funksioni im "getChildrenOfAllNodes":
function getChildrenOfAllNodes(DOMNOde $node,$nodes,$counter){
foreach($node->childNodes as $child){
if($child->hasChildNodes()){
list($nodes,$counter) = getChildrenOfAllNodes($child,$nodes,$counter);
};
if(strpos($child->nodeName,'#') === false){
if(array_key_exists($child->nodeName,$nodes)){
$nodes[$child->nodeName]['count'] += 1;
$nodes[$child->nodeName]['path'] = $child->getNodePath();
}else{
$nodes[$child->nodeName] = array(
'name' => $child->nodeName,
'path' => $child->getNodePath(),
'count' => 1
);
}
$counter++;
};
};
return array($nodes,$counter);
};
Punon me skedarë rreth 1000 nyje, por skedarë me më shumë se 1000 nyje, vazhdon të përpunohet.
Pyetja ime është: a ka një zgjidhje (më të mirë) (se kjo) për të marrë të gjithë emrat + nyjet në një skedar xml për skedarë shumë të mëdhenj?
Faleminderit!