views:

91

answers:

1

I have something like this (sorry for the bad names)

   <?xml version="1.0" encoding="utf-8" ?>
    <root xmlns="http://www.domain.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.domain.com Schema.xsd">
      <product></product>
      <SomeHighLevelElement>
         <anotherElment>
              <lowestElement> </lowestElement>
         </anotherElment>
      </SomeHighLevelElement>
    </root>

I have something like this for my class

public class MyClass
{
    public MyClass()
    {
        ListWrapper= new List<UserInfo>();
    }


    public string product{ get; set; }


    public List<SomeHighLevelElement> ListWrapper{ get; set; }


}

public class SomeHighLevelElement
{

    public string lowestElement{ get; set; }
}

But I don't know how to write the code for the "anotherElement" not sure if I have to make another wrapper around it.

Edit

I know get a error in my actual xml file. I have this in my tag

xmlns="http://www.domain.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.Domain.com Schema.xsd

Throws an exception on the root line saying there was a error with this stuff. So I don't know if it is mad at the schemaLocation since I am using local host right now or what.

Error

System.InvalidOperationException was caught
  Message="There is an error in XML document (2, 2)."
  Source="System.Xml"
+2  A: 

Here's a simple example based on the info you provided. Basically, you will need to make a separate class for anotherElment which contains a string.

You can control exactly how your class parses the Xml elements using attributes, which basically maps your class properties to elements/attributes in the Xml file. So for example, since your document element in the sample Xml you provided is root, I explicitly define that MyClass has a document element called root to match your Xml. By default, the serializer will look for an element called MyClass, and if you omit it, the deserialize method will throw.

This should help get you going:

using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;

[XmlRoot("root")]
public class MyClass
{
    public MyClass()
    {

    }

    public string product { get; set; }

    [XmlElement("SomeHighLevelElement")]
    public List<SomeHighLevelElement> ListWrapper { get; set; }

}

public class SomeHighLevelElement
{
    public AnotherElment anotherElment { get; set; }
}

public class AnotherElment
{
    public string lowestElement { get; set; }
}

And a sample test method based on the Xml you provided:

using System.Xml;
using System.Xml.Serialization;
using System.IO;
.
.
.
public void Test()
{
    string xml = @"<root>
                  <product>product name</product>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>foo</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>bar</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>baz</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                </root>";
    MyClass c = Deserialize<MyClass>(xml);
}

public T Deserialize<T>(string xml)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    return (T)serializer.Deserialize(new StringReader(xml));
}
wsanville
Ah I was close with my current version. However I now getting a error in my xml document. I will post what I have in my original post.
chobo2
One more thing how do I make it validate. Like for instance I removed my product tag from a xml document I was importing. I expected it to throw an exception but it went on it's merry way. If it is missing I want it to throw an exception. How can I do that.
chobo2