Faster FindNode

SVN:trunk[1976]
This commit is contained in:
Denis Flaven
2012-05-03 14:33:08 +00:00
parent 3e3195d6cf
commit 793e0be473

View File

@@ -1233,6 +1233,43 @@ class MFElement extends DOMElement
return $res;
}
public function SetNodeAsArrayOfItems($aList)
{
$oNewNode = $this->ownerDocument->CreateElement($this->tagName);
if ($this->getAttribute('id') != '')
{
$oNewNode->setAttribute('id', $this->getAttribute('id'));
}
self::AddItemToNode($this->ownerDocument, $oNewNode, $aList);
$this->parentNode->RedefineChildNode($oNewNode);
}
protected static function AddItemToNode($oXmlDoc, $oXMLNode, $itemValue)
{
if (is_array($itemValue))
{
$oXmlItems = $oXmlDoc->CreateElement('items');
$oXMLNode->AppendChild($oXmlItems);
foreach($itemValue as $key => $item)
{
$oXmlItem = $oXmlDoc->CreateElement('item');
$oXmlItems->AppendChild($oXmlItem);
if (is_string($key))
{
$oXmlItem->SetAttribute('key', $key);
}
self::AddItemToNode($oXmlDoc, $oXmlItem, $item);
}
}
else
{
$oXmlText = $oXmlDoc->CreateTextNode((string) $itemValue);
$oXMLNode->AppendChild($oXmlText);
}
}
/**
* Helper to remove child nodes
*/
@@ -1263,7 +1300,7 @@ class MFElement extends DOMElement
* @param MFElement $oRefNode The node to search for
* @param bool $sSearchId substitutes to the value of the 'id' attribute
*/
public static function FindNode(DOMNode $oParent, MFElement $oRefNode, $sSearchId = null)
public static function FindNodeSlow(DOMNode $oParent, MFElement $oRefNode, $sSearchId = null)
{
$oRes = null;
if ($oRefNode->hasAttribute('id'))
@@ -1300,6 +1337,49 @@ class MFElement extends DOMElement
return $oRes;
}
/**
* Seems to work fine (and is about 10 times faster than above) EXCEPT for menus !!!!
* @param unknown_type $oParent
* @param unknown_type $oRefNode
* @param unknown_type $sSearchId
* @throws Exception
*/
public static function FindNode(DOMNode $oParent, MFElement $oRefNode, $sSearchId = null)
{
$oRes = null;
if ($oParent instanceof DOMDocument)
{
$oDoc = $oParent->firstChild->ownerDocument;
$oRoot = $oParent;
}
else
{
$oDoc = $oParent->ownerDocument;
$oRoot = $oParent;
}
$oXPath = new DOMXPath($oDoc);
if ($oRefNode->hasAttribute('id'))
{
// Find the first element having the same tag name and id
if (!$sSearchId)
{
$sSearchId = $oRefNode->getAttribute('id');
}
$sXPath = './'.$oRefNode->tagName."[@id='$sSearchId']";
$oRes = $oXPath->query($sXPath, $oRoot)->item(0);
}
else
{
// Get the first one having the same tag name (ignore others)
$sXPath = './'.$oRefNode->tagName;
$oRes = $oXPath->query($sXPath, $oRoot)->item(0);
}
return $oRes;
}
public function ListActiveChildNodes($sTagName)
{
$sXPath = $sTagName."[not(@_alteration) or @_alteration!='removed']";