Hi ,
I have created a small project and want to implement few things in it.
but since i m new to C# and XML i m finding it difficult to proceed.
These are things which i want in my project....
- The use of a background thread for the process of loading the XML data, possibly with a progress bar to let the user know
that the application is actively doing something.
- NodeType is of enumarated type XmlNodeType, yet the values are
compared as strings.What should be there instead of strings?How to use
enumerated data types?
- The while(flag) execution control structure can potentially lead to
infinite loop, the algorithm could be better formulated, with a more
explicit (i.e. visible/understandable for the developer) loop
condition.Ho wto use for loop here?
- In treeView1_AfterSelect, the text parsing code depends on the textual
representation for a node in the tree view, which can be changed at any
time and break the entire logic of list display. This strong dependency
between the tree view and the list display should be eliminated by
binding nodes in the treeview to nodes of the XML document, so that the
raw Xml data can be used to display text in the list.What should i write here?
- Improve structure of code by placing related business logic in separate
class while keeping frontend class free from business logic as far as
possible. It is recommended to use a class for xml related logic taking
xml file "uri" as initializer. The use of a Model-View architecture is
recommended, to achieve separation of concerns. How to proceed in this case?
- Improve display of node attributes such that only node name is added to
tree and attributes of clicked node appear in GUI controls on right
hand side of form.
using System;
using System.IO;
using System.ComponentModel;
using System.Threading;
using System.Xml;
using System.Windows.Forms;
namespace LoadXMLtreeDisplay
{
public partial class TreeDisplay : Form
{
public string Filename
{ get { return filename; } }
protected string filename;
//Declaring constructor of the Class
public TreeDisplay()
{
InitializeComponent();
this.Text = "Tree View of XML File";//Form Title.
}//TreeDisplay Constructor
private void initiatingTree(string nameofFile)
{
try
{
//Create XML document & load the XML file.
//xmlDocument.Load(nameofFile);
treeView1.Nodes.Clear();
if (xmlDocument.DocumentElement != null) treeView1.Nodes.Add(new TreeNode(xmlDocument.DocumentElement.Name));
//Creating TreeNode and adding the first node to it.
TreeNode tNodeObj = treeView1.Nodes[0];
//Creating XmlNodeList to load all the nodes of XML file in the list and
//initialising the XmlNode with first element of the xml filename.
XmlNode xNode = xmlDocument.DocumentElement;
//Declaring function for adding Nodes to tree View.
AddingNodesToTree(xNode,tNodeObj);
toolStripStatusLabel1.Text = "Opened file " + nameofFile;
treeView1.Nodes[0].Expand();
treeView1.CollapseAll();
}//try block ends
//Exception Handlers to catch any sort of error
catch (XmlException xmlex)
{
MessageBox.Show(xmlex.Message, "Error");
}//catch
catch (Exception exp)
{
txtFileName.Text = exp.Message;
}
}//initiatingTree
//Method to add Nodes to tree
private static void AddingNodesToTree(XmlNode xmlNode,TreeNode tnode)
{
//Adding nodes to tree while looping through the entire XML file
if (xmlNode.HasChildNodes)
{
XmlNodeList nodeList = xmlNode.ChildNodes;
for (int i = 0; i <= nodeList.Count - 1; i++)
{
XmlNode xmladdtreeNode = xmlNode.ChildNodes[i];
String nodetype = "" + xmladdtreeNode.NodeType;
if (nodetype.Equals("Text") || nodetype.Equals("Comment")) // if node type is text or comment
{
tnode.Nodes.Add(new TreeNode(xmladdtreeNode.InnerText)); // simply add it in the tree
}
else // else if it has children
{
String name = "<" + xmladdtreeNode.Name;
XmlAttributeCollection attCol = xmladdtreeNode.Attributes; // Collects all the attributes of a node in attCol
foreach (XmlAttribute xmlatt in attCol)
{
name += " " + xmlatt.Name + "=\"" + xmlatt.Value + "\"";
}
name += ">";
TreeNode tn = new TreeNode(xmladdtreeNode.Name);
tn.Text = name;
tnode.Nodes.Add(tn);
TreeNode treeNode = tnode.Nodes[i];
AddingNodesToTree(xmladdtreeNode,treeNode); // the method is called recursively to get all the child nodes and their attributes till the loop is over
}
}//for
}//if
else
{
tnode.Text = xmlNode.OuterXml.Trim(); //Removes all the white spaces when there are no children of the parent
}//else
}//AddingNodesToTree
//To show Attributes and values of selected Nodes.
private void treeView1_AfterSelect(object sender,TreeViewEventArgs e)
{
listBox1.Items.Clear();
TreeNode treenode = e.Node; //Node selected in Treeview
String text = treenode.Text;
String relevent = text;
Boolean flag = true;
while (flag)
{
int SpaceIndex = relevent.IndexOf(" ");
if (SpaceIndex != -1)
{
int indexofEqual = relevent.IndexOf('=', SpaceIndex);
if (indexofEqual != -1)
{
int indexOFValue = relevent.IndexOf("\"", indexofEqual + 2);
if (indexOFValue != -1)
{
String attribute = relevent.Substring(SpaceIndex + 1, indexofEqual - SpaceIndex - 1); //starts displaying the attribute name after space for the given length
String value = relevent.Substring(indexofEqual + 2, indexOFValue - indexofEqual - 2); //starts displaying the attribute value after "="sign for the given length
listBox1.Items.Add("Attribute : " + attribute + " Value : " + value); // add it in the list box
relevent = relevent.Substring(indexOFValue);
}
else
{
listBox1.Items.Add("Bad format of the xml file for this node");
flag = false;
}
}
else
{
flag = false;
}
}
else
{
flag = false;
}
}
}//AfterSelect()
//To select a XML file to be shown as treeview.
private void btnBrowse_Click(object sender,EventArgs e)
{
txtFileName.Clear(); //Clearing all the controls before loading any other xml file in Treeview.
listBox1.Items.Clear();
treeView1.Nodes.Clear();
ExpandBtn.Text = "Expand Tree Nodes";
bgWorker1.RunWorkerAsync();
StripProgressBar.Value = 0;
toolStripStatusLabel1.Text = "Browsing for a Xml file";
OpenFileDialog open = new OpenFileDialog();
open.InitialDirectory = @"C:\";//to start searching XML file with c directory.
open.Filter = "XML Files (*.xml)|*.xhtml|All files(*.*)|*.*";//to list only xml,xhtml and all files in browse window.
open.FilterIndex = 2;
open.RestoreDirectory = true;//Restore the old directory
if (open.ShowDialog(this) == DialogResult.OK)
{
txtFileName.Text = open.FileName;
initiatingTree(open.FileName); //this variable gives the name of selected file
}
while (this.bgWorker1.IsBusy)
{
StripProgressBar.Increment(1);
// Keep UI messages moving, so the form remains
// responsive during the asynchronous operation.
Application.DoEvents();
}
}//Browse button
private void bgWorker1_DoWork(object sender, DoWorkEventArgs e)
{
xmlDocument = new XmlDocument();
Thread.Sleep(5000);
xmlDocument.Load(txtFileName.Text);
btnBrowse.Enabled = false;
}
private void bgworker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Set progress bar to 100% in case it's not already there.
StripProgressBar.Value = 100;
if (e.Error == null)
{
MessageBox.Show(xmlDocument.InnerXml, "Download Complete");
}
else
{
MessageBox.Show(
"Failed to download file",
"Download failed",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
// Enable the Browse button and reset the progress bar.
this.btnBrowse.Enabled = true;
StripProgressBar.Value = 0;
toolStripStatusLabel1.Text = "work finished processing request.";
}//workerCompleted
}// TreeDisplay Class
}//namespace
Will be eagerly waiting for your reply.
Hope to find suitable help and guidance from you.
Thanks & Regards
RachS