Gopi krishna ch
Gopi krishna ch

Reputation: 39

Creating Xml Dynamically From Object

Here I have a scenario that Create xml file dynamically and it should be serialisable. xml is like:

<person>
    <personaldata>
        <name>gopi</name>
        <lastname>ch</lastname>
    </personaladata>
    <Educationaladata>
        <Graduation>b.tech</graduation>
        <designation>Engineer</designation>
    </educationaldata>
</person>

person class has name, lastname, designation, graduation and properties

I tried this

public string CreateXmlObject(Person objPerson)    
{
    var objXmlDocument = new XmlDocument();
    var objXpath = objXmlDocument.CreateNavigator();
    var objXmlSeialiser = new XmlSerializer(objPerson.GetType());
    using (var xs = objXpath.AppendChild())
    {
        objXmlSeialiser.Serialize(xs, objPerson);
    }
    return objXmlDocument.OuterXml;
}

My Problem is I have to read Specific data from Xml And Update Specific data to Xml . I want to read only Personaldata when i update, update should only apply to Personaldata Not Otherdata

Upvotes: 1

Views: 2765

Answers (3)

jdweng
jdweng

Reputation: 34433

Try xml linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string name = "gopi";
            string lastname = "ch";
            string graduation = "b.tech";
            string designation = "Engineer";

            XElement personalData = new XElement("person", new XElement[] {
                new XElement("personaldata", new XElement[] {
                    new XElement("name", name),
                    new XElement("lastname", lastname)
                }),
                new XElement("Educationadata", new XElement[] {
                    new XElement("Graduation", graduation),
                    new XElement("designation", designation)
                })
            });

        }
    }
}
​

Upvotes: 3

Rahul Singh
Rahul Singh

Reputation: 21825

Fisrt of all your XML is invalid, all the nodes should match their closing tags. Considering your person class looks something like this:-

public class Person
        {
            public string name { get; set; }
            public string lastname { get; set; }
            public string Graduation { get; set; }
            public string designation { get; set; }
        }

You can easily do it with LINQ-to-XML:-

Xdocument = XDocument.Load("XMLFilePath");
 List<Person> persons = (from person in xdoc.Descendants("person")
                         let personaldata = person.Element("personaldata")
                         let Educationaladata = person.Element("Educationaladata")
                         select new Person
                                {
                                  name = (string)personaldata.Element("name"),
                                  lastname = (string)personaldata.Element("lastname"),
                                  Graduation = (string)Educationaladata.Element("Graduation"),
                                  designation = (string)Educationaladata.Element("designation")
                                 }).ToList();

Upvotes: 2

Amit Kumar Ghosh
Amit Kumar Ghosh

Reputation: 3726

sSometing like -

var xml = XDocument.Load("xml path");
var personaldata = xml.Descendents("personaldata").FirstOrDefault();
if (data != null)
{
    foreach (var t in data.Descendants())
    {
        t.Value = "test";
    }                
}

Upvotes: 0

Related Questions