-3

I am trying to read an XML document. Now I am able to call information if I am reading from "/word/link1" but as soon as I go deeper "buttons/word/link1" it fails to read the InnerText at all.

public void rxml()
    {
        XmlTextReader read = new XmlTextReader("C:\\myXmFile.xml");
        XmlDocument doc = new XmlDocument(); 
        doc.Load(read);
        switch (P)
        {
            case "word":
                label11.Text = "Microsoft Word Documents";

                l1 = doc.SelectSingleNode("buttons/word/link1").InnerText = "hello";
                p1 = doc.SelectSingleNode("buttons/word/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/word/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/word/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/word/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/word/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/word/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/word/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/word/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/word/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/word/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/word/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/word/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/word/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/word/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/word/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/word/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/word/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/word/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/word/path10").InnerText;
                read.Close();
                break;
            case "excel":
                label11.Text = "Microsoft Excel Documents";
                l1 = doc.SelectSingleNode("buttons/excel/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/excel/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/excel/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/excel/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/excel/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/excel/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/excel/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/excel/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/excel/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/excel/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/excel/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/excel/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/excel/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/excel/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/excel/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/excel/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/excel/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/excel/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/excel/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/excel/path10").InnerText;
                read.Close();
                break;
            case "adobe":
                label11.Text = "Adobe PDF Documents";
                l1 = doc.SelectSingleNode("buttons/adobe/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/adobe/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/adobe/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/adobe/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/adobe/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/adobe/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/adobe/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/adobe/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/adobe/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/adobe/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/adobe/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/adobe/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/adobe/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/adobe/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/adobe/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/adobe/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/adobe/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/adobe/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/adobe/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/adobe/path10").InnerText;
                read.Close();
                break;
            case "powerpoint":
                label11.Text = "Microsoft Powerpoint Documents";
                l1 = doc.SelectSingleNode("buttons/powerpoint/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/powerpoint/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/powerpoint/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/powerpoint/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/powerpoint/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/powerpoint/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/powerpoint/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/powerpoint/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/powerpoint/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/powerpoint/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/powerpoint/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/powerpoint/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/powerpoint/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/powerpoint/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/powerpoint/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/powerpoint/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/powerpoint/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/powerpoint/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/powerpoint/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/powerpoint/path10").InnerText;
                read.Close();
                break;
            case "publisher":
                label11.Text = "Microsoft Publisher Documents";
                l1 = doc.SelectSingleNode("buttons/publisher/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/publisher/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/publisher/link2").InnerText = linkLabel1.Text;
                p2 = doc.SelectSingleNode("buttons/publisher/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/publisher/link3").InnerText = linkLabel1.Text;
                p3 = doc.SelectSingleNode("buttons/publisher/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/publisher/link4").InnerText = linkLabel1.Text;
                p4 = doc.SelectSingleNode("buttons/publisher/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/publisher/link5").InnerText = linkLabel1.Text;
                p5 = doc.SelectSingleNode("buttons/publisher/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/publisher/link6").InnerText = linkLabel1.Text;
                p6 = doc.SelectSingleNode("buttons/publisher/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/publisher/link7").InnerText = linkLabel1.Text;
                p7 = doc.SelectSingleNode("buttons/publisher/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/publisher/link8").InnerText = linkLabel1.Text;
                p8 = doc.SelectSingleNode("buttons/publisher/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/publisher/link9").InnerText = linkLabel1.Text;
                p9 = doc.SelectSingleNode("buttons/publisher/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/publisher/link10").InnerText = linkLabel1.Text;
                p10 = doc.SelectSingleNode("buttons/publisher/path10").InnerText;
                read.Close();
                break;
            case "access":
                label11.Text = "Microsoft Access Documents";
                l1 = doc.SelectSingleNode("buttons/access/link1").InnerText = linkLabel1.Text;
                p1 = doc.SelectSingleNode("buttons/access/path1").InnerText;
                l2 = doc.SelectSingleNode("buttons/access/link2").InnerText = linkLabel2.Text;
                p2 = doc.SelectSingleNode("buttons/access/path2").InnerText;
                l3 = doc.SelectSingleNode("buttons/access/link3").InnerText = linkLabel3.Text;
                p3 = doc.SelectSingleNode("buttons/access/path3").InnerText;
                l4 = doc.SelectSingleNode("buttons/access/link4").InnerText = linkLabel4.Text;
                p4 = doc.SelectSingleNode("buttons/access/path4").InnerText;
                l5 = doc.SelectSingleNode("buttons/access/link5").InnerText = linkLabel5.Text;
                p5 = doc.SelectSingleNode("buttons/access/path5").InnerText;
                l6 = doc.SelectSingleNode("buttons/access/link6").InnerText = linkLabel6.Text;
                p6 = doc.SelectSingleNode("buttons/access/path6").InnerText;
                l7 = doc.SelectSingleNode("buttons/access/link7").InnerText = linkLabel7.Text;
                p7 = doc.SelectSingleNode("buttons/access/path7").InnerText;
                l8 = doc.SelectSingleNode("buttons/access/link8").InnerText = linkLabel8.Text;
                p8 = doc.SelectSingleNode("buttons/access/path8").InnerText;
                l9 = doc.SelectSingleNode("buttons/access/link9").InnerText = linkLabel9.Text;
                p9 = doc.SelectSingleNode("buttons/access/path9").InnerText;
                l10 = doc.SelectSingleNode("buttons/access/link10").InnerText = linkLabel10.Text;
                p10 = doc.SelectSingleNode("buttons/access/path10").InnerText;
                read.Close();
                break;

        }

    }

XML file http://pastebin.com/i5vVt0GV

Marshal
  • 1,177
  • 4
  • 18
  • 30
  • 1
    @Marshal I think it might be a good idea to post a short XML file with which this code fails. – spender Feb 20 '12 at 11:27
  • Please provide xml and what exception / problem you get. And complete code for rxml() :) – bang Feb 20 '12 at 11:29
  • I'm confused - your sample code is setting the value of the `buttons/word/link1` and `buttons/word/link2` nodes instead of getting them - why? You should also provide a short XML sample and detail abou the exception that is being thrown. – Justin Feb 20 '12 at 11:33
  • I have just submitted a pastebin version of my XML file. It is all located in buttons because of this problem. I would like to set it up with the heading "MLE Dash" however if I do that I cannot read the URL or Workshop innertexts. Now I have the same problem with the word, adobe etc elements. – Marshal Feb 20 '12 at 11:44
  • 1
    Please post an excerpt of the XML here. SO offers code formatting. – H H Feb 20 '12 at 12:23

1 Answers1

1

To make accessing the data easier, you should create classes for accesing the data. By breaking down the problem into different levels, it makes the whole easier to understand, debug, and keep current. I've gone ahead and created an example of this using this file of extensions.

To use the following you'd get link1 of word with:

ButtonsXml buttons = new ButtonsXml("C:\\myXmFile.xml");
string link1 = buttons["word"][1].Link;

Here's the code:

public class ButtonsXml
{
    XElement self;
    Dictionary<string, DataCollection> list = new Dictionary<string, DataCollection>();

    public ButtonsXml(string file)
    {
        self = XElement.Load(file);
    }

    public DataCollection this[string name]
    {
        get
        {
            if (list.ContainsKey(name))
                return list[name];
            DataCollection c = new DataCollection(self.GetElement(name));
            list.Add(name, c);
            return c;
        }
    }

    public void Save(string file)
    {
        self.Save(file);
    }
}

public class DataCollection
{
    XElement self;
    public Dictionary<int, Element> list = new Dictionary<int,Element>();

    public DataCollection(XElement self)
    {
        this.self = self;
    }

    public Element this[int index]
    {
        get
        {
            if (list.ContainsKey(index))
                return list[index];
            Element e = new Element(self, index);
            list.Add(index, e);
            return e;
        }
    }
}

public class Element
{
    XElement parent;
    int index;

    public Element(XElement parent, int index)
    {
        this.parent = parent;
        this.index = index;
    }

    public string Path
    {
        get { return parent.GetString("path" + index.ToString(), string.Empty); }
        set { parent.Set("path" + index.ToString(), value, XElementConversions.ELEMENT); }
    }

    public string Link
    {
        get { return parent.GetString("link" + index.ToString(), string.Empty); }
        set { parent.Set("link" + index.ToString(), value, XElementConversions.ELEMENT); }
    }
}

In case you want to set values to Path or Link, I've added setters: They would be set in the same fashion. Then buttons.Save(file) will need to be called to save the changes to file.

buttons["word"][1].Link = "new value";
Chuck Savage
  • 11,775
  • 6
  • 49
  • 69