Mobile Development Storing State with XML Rob Miles Department of Computer Science.

32
Mobile Development Storing State with XML Rob Miles Department of Computer Science

Transcript of Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Page 1: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Mobile Development

Storing State with XML

Rob MilesDepartment of Computer Science

Page 2: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Introduction

An introduction to the problem Writing an XML file

> The XMLTextWriter class> Attributes and Elements in XML> Text Encoding in XML files

Reading an XML document> The XMLDocument class

XML and namespaces Storing the XML on a Smartphone/PocketPC

Page 3: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Storing High Score Data

I wanted to store the high score of a player in a Smartphone game

> Name of the player> Name of the game> Score reached in the game

The data may need to be exported and used in other systems, for example league tables

XML is the obvious choice for this

Page 4: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Writing a PC Version

Unless you use some of the Mobile Powertoys it is hard to see what a Smartphone application is doing

I therefore decided to write a PC version of the code

I can port the important bits later

Page 5: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

XML Namespaces

To get direct access to the XML methods and the text encoding types I have to use two namespaces:

using System.Xml;

using System.Text; Once I have these I can write a method to

save the values in an XML document

Page 6: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Writing an XML document

public void SaveXML ( string filename ) {XmlTextWriter writer ;writer = new XmlTextWriter( filename, Encoding.ASCII);writer.Formatting = Formatting.Indented ;writer.WriteStartDocument();writer.WriteStartElement("highscore");writer.WriteEndElement();writer.WriteEndDocument();writer.Close();

}

document with an empty highscore element

Page 7: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Empty XML Document

<?xml version="1.0" encoding="us-ascii"?>

<highscore /> The header of the document simply describes the

version of xml and the encoding being used The score element is shown as empty This is a completely legal XML document

> but it does not contain any data.

Page 8: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

XML Attributes and Elements

There are two types of information in an XML file> Element: a lump of data about something; may contain other

elements

> Attribute: used to further describe a particular element.

The document being created presently has one element, called highscore.

I can add an attribute to the highscore element which identifies the game the score is for

Page 9: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Adding an Attribute

public void SaveXML ( string filename ) {XmlTextWriter writer ;writer = new XmlTextWriter (filename,Encoding.ASCII);writer.Formatting = Formatting.Indented;writer.WriteStartDocument();writer.WriteStartElement("highscore");writer.WriteAttributeString( "game", "Breakout");writer.WriteEndElement();writer.WriteEndDocument();writer.Close();

}

Page 10: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Elements and Attribute Output

<?xml version="1.0" encoding="us-ascii"?>

<highscore game="Breakout" /> The game attribute identifies the name of the game

for which the high score was reached This attribute is attributed to a given highscore

element

Page 11: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Adding the Player and Score

Now we need to add the data about the player and the score reached

There are two ways to do this:> add two more attributes to the highscore element. These

would be called player and score and would hold the required values.

> add two new elements, player and score inside the highscore element

Page 12: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Elements vs. Attributes

I have decided that player and score should be elements rather than attributes

It is easier for me to extend the player and score storage;> I could add the address of the player and the date and time the score was

achieved > Those attributes should bind to the player and score items, not the highscore

itself

Information directly about the high score data, such as the game it applies to, should be an attribute

Another use for an attribute would be as an id tag of an element, or perhaps a version number (which you can see in the header of the XML file itself)

Page 13: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Writing the High Score

XmlTextWriter writer;writer = new XmlTextWriter( filename, Encoding.ASCII) ;writer.Formatting = Formatting.Indented;writer.WriteStartDocument(); writer.WriteStartElement("highscore"); writer.WriteAttributeString( "game", "Breakout"); writer.WriteElementString("playername",playerName); writer.WriteElementString("score", score.ToString()); writer.WriteEndElement();writer.WriteEndDocument();writer.Close();

Page 14: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

High Score XML

<?xml version="1.0" encoding="us-ascii" ?>

<highscore game="Breakout">

  <playername>Rob Miles</playername>

  <score>1500</score>

</highscore>

Page 15: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

XML & Meanings

Before we read the XML it is important to have discussion about the meaning of things

The program that we write will ascribe meaning to the elements it gets:

> A score which is a big value is “good”> In golf this would not be true…..

There is nothing in the XML which gives the meaning of the data itself

Page 16: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Element Namespace

Not to be confused with the C# namespace (although the intention is similar)

Allows an element to state the context in which this element has meaning

This means that two programmers using the same name for an element could ensure that people using their elements can determine the proper context/ontology

Page 17: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Adding a Namespace

writer.WriteStartElement("highscore",

"www.mygameuri.com/highscore");

The uri gives the user of this element a unique identifier for this element

This ensures that my highscore element can be identified as unique

There does not have to be a web page at the uri

Page 18: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

The Namespace in XML

<highscore game="Breakout"

xmlns="www.mygameuri.com/highscore"> The xmlns attribute identifies the namespace

for this element I can create a set of namespaces based at a

particular uri We will see how these are tested later on

Page 19: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Reading XML

We are going to use the XmlDocument class provided by .NET:// get a new document

document = new XmlDocument();

// load it from a file

document.Load(filename);

We can then read properties off the document to get at the data

Page 20: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

XmlDocument structure

Name : highscoreNamespaceURI: www.mygameuri.com/highscore

game: “Breakout”

playername score

“Rob Miles” “1234”

Page 21: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Getting the Root element

System.Xml.XmlElement rootElement = document.DocumentElement;// make sure it is the right elementif ( rootElement.Name != "highscore" ) {Console.WriteLine ( "Wrong data" );

} This gets the root element for the document and

makes sure it is the right one

Page 22: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Checking a namespace

// make sure it is in the right namespace

if ( rootElement.NamespaceURI !=

"www.mygameuri.com/highscore" )

{

Console.WriteLine ("Wrong namespace");

} All elements have a namespace property which maps

on to the namespace attribute

Page 23: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Reading an attribute

// check to see if the name is correctstring gameName = rootElement.GetAttribute("game");if ( gameName != "Breakout" ) {return false ;

} Attributes are accessed by their name using the GetAttribute method

Page 24: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Getting a Child Element

The simplest way to get hold of a child element is to use the name as an indexer:

XmlNode playerNameNode = rootElement["player"];

if ( playerNameNode == null )

{

Console.WriterLine ( "Missing player name" );

}

This gets the element with the given name, or null if the name is not found.

Page 25: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Get the value of an element

The value of an element is a child of that element:

playerName = playerNameNode.FirstChild.Value;

The FirstChild member of the element in this case is the data payload of that element

We can set the player name to this All the values are returned as strings This means that we need to parse the score

value to get an integer

Page 26: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Setting Values

You can set values in an element as well There is also a method call which will save an

element (and all of it’s children) This can be used if you have updated values

in the document that you want to save ou want

Page 27: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

File Storage

You need to decide where to store the XML files themselves

The obvious place to put them is the same directory as the binary program

On the Compact Framework you need to do a bit of work to get the location of this

Page 28: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Getting the Current Directory

System.Reflection.Assembly execAssem = System.Reflection.Assembly.GetExecutingAssembly();

// set up the application filename// from the current assemblystring appFilePath =

execAssem.GetModules()[0].FullyQualifiedName;// now strip the path from this filenameapplicationDirectory =

System.IO.Path.GetDirectoryName(appFilePath);// make sure we have a path separator on the endif (!applicationDirectory.EndsWith(@"\")){

applicationDirectory += @"\";}

Page 29: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

Demo 01 – Saving and Loading Scores

This project runs on a Smartphone and saves the score values which are entered by the user

It can also load them back

Page 30: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

XML and Data

XML data elements always end up as text If you want to store text which may contain

things like < and > you will have to investigate CDATA which lets you write strings containing arbitrary text

You must also perform parsing to recover any numeric values which you have stored

> Remember to handle errors!

Page 31: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

XML and Programs

The XMLDocument is a very good way to hold a structure in memory

But if you simply want to read object states you may decide instead to just read through the XML elements and pull out the properties you want

Page 32: Mobile Development Storing State with XML Rob Miles Department of Computer Science.

XML is Fun!

No, really….. It provides a very easy way to manage

program data in a flexible and extensible manner

> For very little effort on your part

Whenever you are storing program data, and you aren’t putting it in a database, you should put it in XML!