Jack Kada
Jack Kada

Reputation: 25232

Reading XMLDocument Into An Object

This should be easy but I am struggling to understand how to do this with XMLReader or with Linq.

This is a pet project I am working on over the weekend to improve my skills - Ideally this should have all nested objects as first class objects but I am open to ideas about how to interpret this

EDIT: I have tried the XMLReader but my code is more then 30 0lines wrong and looks horrible - In C# how can you translate XML into objects?

Can I deserialise this into an object by using a Deserialiser and if so do I construct all the objects by hand?

    '<level4>
        <module>
            <moduleCode>ECSC401</moduleCode>
            <moduleTitle>Programming Methodology</moduleTitle>
            <credits>15</credits>
            <semester>1</semester>
            <assessmentDetails>
                <assessment>
                    <assessmentName>Test1</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Coursework</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>40</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Test2</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
            </assessmentDetails>
        </module>
        <module>
            <moduleCode>ECSC404</moduleCode>
            <moduleTitle>Computer Systems Fundamentals</moduleTitle>
            <credits>15</credits>
            <semester>1</semester>
            <assessmentDetails>
                <assessment>
                    <assessmentName>Test1</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Test2</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Test3</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>40</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
            </assessmentDetails>
        </module>
        <module>
            <moduleCode>EBSY401</moduleCode>
            <moduleTitle>Information and Data Modelling</moduleTitle>
            <credits>15</credits>
            <semester>1</semester>
            <assessmentDetails>
                <assessment>
                    <assessmentName>Test</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>25</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Coursework1</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>10</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Coursework2</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>35</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>                    
                <assessment>
                    <assessmentName>Coursework3</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
            </assessmentDetails>
        </module>
        <module>
            <moduleCode>ECSC405</moduleCode>
            <moduleTitle>Software Development Principles</moduleTitle>
            <credits>15</credits>
            <semester>2</semester>
            <assessmentDetails>
                <assessment>
                    <assessmentName>Test1</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Coursework</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>40</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Test2</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
            </assessmentDetails>
        </module>
        <module>
            <moduleCode>ECSC407</moduleCode>
            <moduleTitle>Web Technology</moduleTitle>
            <credits>15</credits>
            <semester>2</semester>
            <assessmentDetails>
                <assessment>
                    <assessmentName>Tutorials</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>20</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Coursework</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>20</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Exam</assessmentName>
                    <assessmentType>Exam</assessmentType>
                    <assessmentWeighting>60</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
            </assessmentDetails>
        </module>
        <module>
            <moduleCode>ECSC409</moduleCode>
            <moduleTitle>Software Engineering Principles</moduleTitle>
            <credits>15</credits>
            <semester>2</semester>
            <assessmentDetails>
                <assessment>
                    <assessmentName>Test1</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>40</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Coursework1</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Coursework2</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
            </assessmentDetails>
        </module>
        <module>
            <moduleCode>ECSC408</moduleCode>
            <moduleTitle>Mathematics for Computing</moduleTitle>
            <credits>15</credits>
            <semester>0</semester>
            <assessmentDetails>
                <assessment>
                    <assessmentName>Coursework</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>50</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Exam</assessmentName>
                    <assessmentType>Exam</assessmentType>
                    <assessmentWeighting>50</assessmentWeighting>
                    <assessmentDueDate></assessmentDueDate>
                </assessment>
            </assessmentDetails>
        </module>
        <module>
            <moduleCode>EBSY400</moduleCode>
            <moduleTitle>Communication and Learning Skills</moduleTitle>
            <credits>15</credits>
            <semester>0</semester>
            <assessmentDetails>
                <assessment>
                    <assessmentName>Presentation</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>30</assessmentWeighting>
                    <assessmentDueDate>2010-05-06</assessmentDueDate>
                </assessment>
                <assessment>
                    <assessmentName>Portfolio</assessmentName>
                    <assessmentType>Coursework</assessmentType>
                    <assessmentWeighting>70</assessmentWeighting>
                    <assessmentDueDate>2010-05-06</assessmentDueDate>
                </assessment>
            </assessmentDetails>
        </module>
    </level4>

Upvotes: 1

Views: 2368

Answers (4)

Blazen
Blazen

Reputation: 322

one way is to use the string with the xml data and the other one is "serializer" in which the XML serializer object to use to read the XML document.

And this function returns object and that is initialized instance of the object

public object LoadFromXmlDocument(string xmlDocument, XmlSerializer serializer)
{
    if (StringUtil.IsEmpty(xmlDocument))
       throw new ArgumentNullException("xmlDocument");
    else if (serializer == null)
       throw new ArgumentNullException("serializer");

//Initializing instance for textreader
TextReader reader = new StringReader(xmlDocument);

//Serializing a textreader content
object obj = serializer.Deserialize(reader);
reader.Close();
reader = null;
return obj;
}

Upvotes: 0

Alex Aza
Alex Aza

Reputation: 78467

I think I didn't understand your question before.
So you need to make a class that will be XML serialized and XML will have the layout you are showing?

If so, you need:

  1. Create XSD schema. xsd.exe can infer schema from xml. You might need to correct inferred schema manually. To infer schema:

    xsd.exe 1.xml
    

    This will generate 1.xsd file.

  2. Create C# classes using xsd.exe.

    xsd.exe 1.xsd /classes /language:cs
    

    This will generate 1.cs file.

  3. Add 1.cs file to your project and use auto-generated classes in your code. Use XmlSeralizer to serialize/deserialize XML.

You can find xsd.exe in .NET SDK (for example C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64).

Upvotes: 1

Alex Aza
Alex Aza

Reputation: 78467

If you want to read XML text into XML object, I suggest using LINQ-to-XML.
You can use XDocument.Parse or XDocument.Load methods.
For example:

    var xmlText = @"
        <level4>
            <module>
                <moduleCode>ECSC401</moduleCode>
                <moduleTitle>Programming Methodology</moduleTitle>
                <credits>15</credits>
                <semester>1</semester>
                <assessmentDetails>
                    <assessment>
                        <assessmentName>Test1</assessmentName>
                        <assessmentType>Coursework</assessmentType>
                        <assessmentWeighting>30</assessmentWeighting>
                        <assessmentDueDate></assessmentDueDate>
                    </assessment>
                </assessmentDetails>
            </module>
        </level4>
        ";
    var xdocument = XDocument.Parse(xmlText);

Upvotes: 0

Dan Diplo
Dan Diplo

Reputation: 25339

One way is to use the XML Schema Definition Tool (Xsd.exe) that comes with the .NET framework tools. If you load your XML in Visual Studio you can use the Create Schema option (XML > Create Schema) and then use xsd.exe to generate your classes using the /c switch.

xsd.exe /c myschema.xsd

"Generates classes that correspond to the specified schema. To read XML data into the object, use the System.Xml.Serialization.XmlSerializer.Deserializer method."

Hope that gives you some ideas?

Upvotes: 0

Related Questions