Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 222
  • Last Modified:

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

0
ellandrd
Asked:
ellandrd
  • 7
  • 2
1 Solution
 
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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 7
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now