Man1
Man1

Reputation: 187

C# - Method for writing xml

I have products in a class that I want to save in a XML file, the products is devided into categoris and I would like to save my products in a XML file formatet like below examlple. Products for category 1 writes under category one and products for category 2 under category two.

Hwo can I write a method that dose that? Thanks in advance.

<Categories>
  <Category ID="1">
    <CategoryName>Categoriname1</CategoryName> 
    <Description>drinks, coffees, beers, ales</Description> 
    <Products>
      <Product>
        <ProductName>Coffe</ProductName> 
        <QuantityPerUnit>15 boxes x 60 bags</QuantityPerUnit> 
        <UnitPrice>25</UnitPrice> 
        <UnitsInStock>3</UnitsInStock> 
        <UnitsOnOrder>0</UnitsOnOrder> 
      </Product>
      <Product>
        <ProductName>Chang</ProductName> 
        <QuantityPerUnit>24 - 12 oz bottles</QuantityPerUnit> 
        <UnitPrice>19</UnitPrice> 
        <UnitsInStock>17</UnitsInStock> 
        <UnitsOnOrder>40</UnitsOnOrder> 
      </Product>
    </Products>
  </Category>
  <Category ID="2">
    <CategoryName>Condiments</CategoryName> 
    <Description>spreads, and seasonings</Description> 
    <Products>
      <Product>
        <ProductName>Productname</ProductName> 

Upvotes: 1

Views: 562

Answers (6)

Martin Liversage
Martin Liversage

Reputation: 106926

One option is to use LINQ to XML. Assume you have these classes (where I have removed some properties to simplify the example):

class Category {
  public Int32 Id { get; set; }
  public String Name { get; set; }
  public IEnumerable<Product> Products { get; set; }
}

public class Product {
  public String Name { get; set; }
}

You can create some test data:

var categories = new[] {
  new Category {
    Id = 1,
    Name = "Category 1",
    Products = new[] {
      new Product { Name = "Coffee" },
      new Product { Name = "Chang" }
    }
  },
  new Category {
    Id = 2,
    Name = "Condiments",
    Products = new[] {
      new Product { Name = "Product 1" }
    }
  }
};

You can then create an XDocument from the test data:

var xmlDocument = new XDocument(
  new XElement(
    "Categories",
    categories.Select(
      c => new XElement(
        "Category",
        new XAttribute("ID", c.Id),
        new XElement("CategoryName", c.Name),
        new XElement("Products",
          c.Products.Select(
            p => new XElement(
              "Product",
              new XElement("ProductName", p.Name)
            )
          )
        )
      )
    )
  )
);

To save it to a file you can use the Save method:

xmlDocument.Save("Categories.xml");

Upvotes: 1

Kangkan
Kangkan

Reputation: 15571

You may also like to simply serialise the object(s) that you have. You may write a method like this:

public static bool WriteToXMLFile(string fullFileNameWithPath, Object obj, Type ObjectType)
    {
        TextWriter xr = null;
        try
        {
            XmlSerializer ser = new XmlSerializer(ObjectType);
            xr = new StreamWriter(fullFileNameWithPath);
            ser.Serialize(xr, obj);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            if(xr != null)
                xr.Close();
        }
        return true;
    }

Upvotes: 1

steinberg
steinberg

Reputation: 620

You can use LINQ to XML.

your example would start off like...

  var root = new XElement("Categories",
                    new XElement("Category", 
                          new XAttribute("ID",1),
                          new XElement("CategoryName", "Categoriname1")
                    )
               );     

Your intellisense should help you get the rest

Upvotes: 2

Daniel Hilgarth
Daniel Hilgarth

Reputation: 174457

You could use the XmlSerializer class or the XmlDocument class or the XDocument class or even the XmlTextWriter class.

Upvotes: 1

Robert
Robert

Reputation: 3302

You need to serialize those classes. Create classes marked with Serializable attribute and use XmlSerializer

example:

http://www.dotnetjohn.com/articles.aspx?articleid=173

Upvotes: 1

Tobias Schittkowski
Tobias Schittkowski

Reputation: 2251

You can use LINQ to XML:

http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

Upvotes: 2

Related Questions