Question

I have searched alot to find a solution, but couldn't come up with one after all. So I hope that someone here can help me out.

I have an xml structure:

    <?xml version="1.0" encoding="utf-8" ?>
    <ReleaseNoteConfig>
      <ReleaseNoteProperties>
        <TemplateLocation>Path to the template location</TemplateLocation>
        <TemplateFileName>wordfile.docx</TemplateFileName>
        <OutLocation>Path to the outlocation</OutLocation>
        <ReleaseName>Stackoverflow</ReleaseName>
        <ChangeOrder>1234</ChangeOrder>
        <ChangesHeader>Change ID</ChangesHeader>
        <ProblemsHeader>Problem ID</ProblemsHeader>
        <Environment>Test</Environment>
      </ReleaseNoteProperties>
      <DocProperties>
        <AuthorReleaseNote>Vincent Verweij</AuthorReleaseNote>
        <CustomerResponsible>Customer name</CustomerResponsible>
        <PlannedTestInstallDate>-</PlannedTestInstallDate>
        <PlannedAccInstallDate>30/04/2014</PlannedAccInstallDate>
        <PlannedProdInstallDate>07/05/2014</PlannedProdInstallDate>
        <TestInstallDate>-</TestInstallDate>
        <AccInstallDate>-</AccInstallDate>
        <ProdInstallDate>-</ProdInstallDate>
        <TestInstaller>-</TestInstaller>
        <AccInstaller>-</AccInstaller>
        <ProdInstaller>-</ProdInstaller>
        <UrlProjectPortal>Url to project site</UrlProjectPortal>
      </DocProperties>
      <SpecialProperties>
        <Customer_x0020_Name>Customer company name</Customer_x0020_Name>
        <Customer_x0020_Reference>No reference</Customer_x0020_Reference>
        <Approval_x0020_Date>15/04/2014</Approval_x0020_Date>
        <MyFerranti_x0020_Reference>1234</MyFerranti_x0020_Reference>
        <Project_x0020_ID>Proj000001</Project_x0020_ID>
      </SpecialProperties>
    </ReleaseNoteConfig>

I have used an online generator to create a json from my XML and then json2csharp to obtain the classes that I need. So eventually it came up with this c# code:

    public class ReleaseNoteProperties
    {
        public string TemplateLocation { get; set; }
        public string TemplateFileName { get; set; }
        public string OutLocation { get; set; }
        public string ReleaseName { get; set; }
        public string ChangeOrder { get; set; }
        public string ChangesHeader { get; set; }
        public string ProblemsHeader { get; set; }
        public string Environment { get; set; }
    }

    public class DocProperties
    {
        public string AuthorReleaseNote { get; set; }
        public string CustomerResponsible { get; set; }
        public string PlannedTestInstallDate { get; set; }
        public string PlannedAccInstallDate { get; set; }
        public string PlannedProdInstallDate { get; set; }
        public string TestInstallDate { get; set; }
        public string AccInstallDate { get; set; }
        public string ProdInstallDate { get; set; }
        public string TestInstaller { get; set; }
        public string AccInstaller { get; set; }
        public string ProdInstaller { get; set; }
        public string UrlProjectPortal { get; set; }
    }

    public class SpecialProperties
    {
        public string Customer_x0020_Name { get; set; }
        public string Customer_x0020_Reference { get; set; }
        public string Approval_x0020_Date { get; set; }
        public string MyFerranti_x0020_Reference { get; set; }
        public string Project_x0020_ID { get; set; }
    }

    public class ReleaseNoteConfig
    {
        public ReleaseNoteProperties ReleaseNoteProperties { get; set; }
        public DocProperties DocProperties { get; set; }
        public SpecialProperties SpecialProperties { get; set; }
    }

This code will read my XML file and deserializes the XML to the objects.

    public ReleaseNoteConfig ReadXmlToObject(string xmlPath)
    {
        StringReader stream = null;
        XmlTextReader reader = null;

        var xDocument = XDocument.Load(xmlPath);
        string xml = xDocument.ToString();

        try
        {
            // Serialise the object
            XmlSerializer serializer = new XmlSerializer(typeof(ReleaseNoteConfig));
            // Read the XML data
            stream = new StringReader(xml);
            // Create a reader
            reader = new XmlTextReader(stream);

            // Convert reader to an object
            return (ReleaseNoteConfig)serializer.Deserialize(reader);
        }
        catch
        {
            return null;
        }
        finally
        {
            if (stream != null) stream.Close();
            if (reader != null) reader.Close();
        }
    }

Now the problem; when I debug in Visual Studio, I see that two of the three objects are filled. Here is a screenshot that I took from the debugger: http://www.smartus.be/xmlProblem/debugger.png

As you can see, DocProperties and ReleaseNoteProperties are filled correctly but SpecialProperties has all null values. First I thought it had something to do with the underscores, but when I added an underscore to a property in DocProperties it was also filled correctly.

I also tried adding the attributes above the properties like XmlElement, XmlRoot etc. but that didn't help either.

I also double checked for typos but it seems that there are none...

Hopefully you guys can help me out on this one.

Thanks in advance.

Vincent

Was it helpful?

Solution 2

I have checked your code. Can you Remove the underscores in the "Customer_x0020_Name" ? at the same time you need to change the property names in the class. Its going to work.

Will this suggestions helps you?

i have checked it .. its working.

I am not sure , whether the tag name with underscore is legal or not.

Mark the answer , if it has solved you question

OTHER TIPS

Change your SpecialProperties class to this:

public class SpecialProperties
{
    [XmlElement("Customer Name")]
    public string CustomerName { get; set; }

    [XmlElement("Customer Reference")]
    public string CustomerReference { get; set; }

    [XmlElement("Approval Date")]
    public string ApprovalDate { get; set; }

    [XmlElement("MyFerranti Reference")]
    public string MyFerrantiReference { get; set; }

    [XmlElement("Project ID")]
    public string ProjectID { get; set; }
}

You can change the property names if you want, the important parts are the XmlElement attributes.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top