read and writing XML file

I have an XML file containing browser stats:

<?xml version="1.0" encoding="iso-8859-1"?>
<browsers>
      <browser name="Firefox" version="3.0.3" platform="Windows" users="314"/>
      <browser name="MSIE" version="7.0" platform="Windows" users="229" />
      <browser name="Firefox" version="3.0.1" platform="Windows" users="112" />
      <browser name="MSIE" version="6.0" platform="Windows" users="75" />
</browsers>

Basically what i'm trying to do is increment the "users" attribute value in each <browser>.  

So when a user visits the site, I get their browser name, version and platform.  I then search the XML file above to see if the users browser name, version & platform already exist?

If it does, increament the "users" attribute, otherwise create a new <browser> node in the XML file and write the users browser name, version and platform to the "name", "version" and "platform" attributes...

So far I can parse the XML file and find info using test data.  However I cannot increment the "users" attribute if browser name, version & platform already exist or create a new node if it doesnt exist.  

Please advise.  See PHP below.
<?php
// dummy test data
$name = 'Opera';
$version = '9.20';
$platform = 'Windows';
 
// create new DOM document object
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
 
// load XML file
$doc->load('browser-stats.xml');
 
// create new DOM XPATH object
$xpath = new DOMXPath($doc);
 
// set XPATH pattern
$query = '/browsers/browser[@name="'.$name.'"][@version="'.$version.'"][@platform="'.$platform.'"]';
 
// execute XPATH query
$entries = $xpath->query($query);
 
// check if users browser name, version and platform have been recorded.  If an entry is found, then we increment otherwise create
if($entries->length > 1)
{
	//increment "users" attribute
}
else
{
	// create new node with browser name, version and platform
}
 
// this is only for testing purposes.
// visit all entries, get attributes and display each attributes value.
foreach ($entries as $entry) 
{
	foreach ($entry->attributes as $attribute)
	 {
		echo $attribute->nodeName.' = '.$attribute->nodeValue.'<br />';
	}
}
?>

Open in new window

LVL 16
ellandrdAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

NoiSCommented:
For What PHP version is your PHP code?
If 5 use SimpleXML. Much better than DOM.
Have another question about XML with a code on the list.
0
ellandrdAuthor Commented:
I'm sorry, the live server has PHP 4 installed.

Can you please help with the above?  I can show you my code for creating new nodes (doesnt work though) ?
0
ellandrdAuthor Commented:
I have got my create node working myself.  However I still need help with the incrementation of users attribute if a node already exists?
0
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

ellandrdAuthor Commented:
OK all i need help with is updating the attribute value?  please see code below..
<?php
$name = 'Safari';
$version = '2.0.3';
$platform = 'Windows';
$users = 0;
 
$doc = new DOMDocument();
$doc->load('browser-stats.xml');
 
$xpath = new DOMXPath($doc);
 
$query = '/browsers/browser[@name="'.$name.'"][@version="'.$version.'"][@platform="'.$platform.'"]';
 
$entries = $xpath->query($query);
 
if($entries->length > 0)
{
	foreach($entries as $entry) 
	{
		foreach($entry->attributes as $attribute)
		{
			if($attribute->nodeName == 'users')
			{
				$users = $attribute->nodeName;
				$value = $attribute->nodeValue;
				
				$value = $value + 1;
				
				// update attribute value for "users"
			}
		}
	}
}
else
{
	$root = $doc->getElementsByTagName('browsers')->item(0);
	
	$browser_node = $doc->createElement('browser');
	$root->appendChild($browser_node);
 
	$name_attribute = $doc->createAttribute('name');
	$version_attribute = $doc->createAttribute('version');
	$platform_attribute = $doc->createAttribute('platform');
	$users_attribute = $doc->createAttribute('users');
	
	$browser_node->appendChild($name_attribute);
	$browser_node->appendChild($version_attribute);
	$browser_node->appendChild($platform_attribute);
	$browser_node->appendChild($users_attribute);
		
	$name_value = $doc->createTextNode($name);
	$version_value = $doc->createTextNode($version);
	$platform_value = $doc->createTextNode($platform);
	$users_value = $doc->createTextNode($users);
	
	$name_attribute->appendChild($name_value);
	$version_attribute->appendChild($version_value);
	$platform_attribute->appendChild($platform_value);
	$users_attribute->appendChild($users_value);
}
 
$doc->preserveWhiteSpace = true;
$doc->formatOutput = true;
$doc->save('browser-stats.xml');
?>

Open in new window

0
ellandrdAuthor Commented:
anybody?
0
NoiSCommented:
Man, I don't know much about XML with DOM.
On the manual have some codes like:
You need to get a DOMNode Element to to

DomNode->set_content('NEW CONTENT');
So, Try
$attribute->set_content(''); on your code above.

Later I will make a test with your code and maybe we can have a light.
0
ellandrdAuthor Commented:
any light?
0
ellandrdAuthor Commented:
plus i want to update a attribute value....
0
ellandrdAuthor Commented:
if you can help me in PHP5 and get a solution working to do what i want then ok?
0
cr4ck3rj4ckCommented:
The only change I've made to your code posted 23.10.08 is on line 27.

$value = $value + 1;

replaced with the following:

$attribute->nodeValue = $value + 1;

Seems to work on my setup.

Hope that helps.
<?php
$name = 'Safari';
$version = '2.0.3';
$platform = 'Windows';
$users = 0;
 
$doc = new DOMDocument();
$doc->load('browser-stats.xml');
 
$xpath = new DOMXPath($doc);
 
$query = '/browsers/browser[@name="'.$name.'"][@version="'.$version.'"][@platform="'.$platform.'"]';
 
$entries = $xpath->query($query);
 
if($entries->length > 0)
{
        foreach($entries as $entry) 
        {
                foreach($entry->attributes as $attribute)
                {
                        if($attribute->nodeName == 'users')
                        {
                                $users = $attribute->nodeName;
                                $value = $attribute->nodeValue;
                                
                                $attribute->nodeValue = $value + 1;
                                
                                // update attribute value for "users"
                        }
                }
        }
}
else
{
        $root = $doc->getElementsByTagName('browsers')->item(0);
        
        $browser_node = $doc->createElement('browser');
        $root->appendChild($browser_node);
 
        $name_attribute = $doc->createAttribute('name');
        $version_attribute = $doc->createAttribute('version');
        $platform_attribute = $doc->createAttribute('platform');
        $users_attribute = $doc->createAttribute('users');
        
        $browser_node->appendChild($name_attribute);
        $browser_node->appendChild($version_attribute);
        $browser_node->appendChild($platform_attribute);
        $browser_node->appendChild($users_attribute);
                
        $name_value = $doc->createTextNode($name);
        $version_value = $doc->createTextNode($version);
        $platform_value = $doc->createTextNode($platform);
        $users_value = $doc->createTextNode($users);
        
        $name_attribute->appendChild($name_value);
        $version_attribute->appendChild($version_value);
        $platform_attribute->appendChild($platform_value);
        $users_attribute->appendChild($users_value);
}
 
$doc->preserveWhiteSpace = true;
$doc->formatOutput = true;
$doc->save('browser-stats.xml');
?>

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
PHP

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.