Mickaël B.
Mickaël B.

Reputation: 345

How to load properties from XML file with C#

I've a method which create an XML file

    public void saveXmlButtons()
    {

        XElement buttons = new XElement("Buttons"); // Create a root node
        for (int i = 0; i < 7; i++)
        {
            XElement id = new XElement("Button", listButtons[i].id.ToString());
            XElement type = new XElement("appType", listButtons[i].type);
            XElement isActive = new XElement("isActive", listButtons[i].isActive);
            XElement name = new XElement("name", listButtons[i].lblName.Content);
            XElement pathIcon = new XElement("pathIcon", listButtons[i].pathIcon);
            XElement pathApp = new XElement("pathApp", listButtons[i].pathApp);
            XElement button = new XElement("Button");
            button.Add(id);
            button.Add(type);
            button.Add(isActive);
            button.Add(name);
            button.Add(pathIcon);
            button.Add(pathApp);
            buttons.Add(button);
        }
        buttons.Save(@"btemp");
        loadXmlButton();

    }

Output :

<?xml version="1.0" encoding="utf-8"?>
<Buttons>
  <Button>
    <Button>0</Button>
    <appType>None</appType>
    <isActive>false</isActive>
    <name />
    <pathIcon>Resources/add.png</pathIcon>
    <pathApp />
  </Button>
  <Button>
    <Button>1</Button>
    <appType>None</appType>
    <isActive>false</isActive>
    <name />
    <pathIcon>Resources/add.png</pathIcon>
    <pathApp />
  </Button>
etc...
</Buttons>

I'm trying to read the different property of each node (Button, appType, isActile), and the documentation doesn't help me.. What is the best way to load each property ? This code doesn't works..

    public void loadXmlButton()
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("btemp");
        foreach (XmlNode node in doc.DocumentElement.ChildNodes)
        {

                string s = node.Attributes["pathApp"]?.InnerText;
                Console.WriteLine(s);
        }
    }

Upvotes: 0

Views: 1900

Answers (1)

Charles Mager
Charles Mager

Reputation: 26213

As suggested, you'd be far better off using the same LINQ to XML API to read your XML as you did to write it. In addition, pathApp is an element, not an attribute, so you're currently using the old API incorrectly.

Try something like this:

var doc = XDocument.Load("btemp");

foreach (var button in doc.Root.Elements())
{
    var id = (int)button.Element("Button");
    var type = (string)button.Element("appType");
    var isActive = (bool)button.Element("isActive");
    ...
}

Upvotes: 2

Related Questions