0

I'm working on creating a class file from the xml file but xsd is complaining saying "Cannot add a nested relation or an element column to a table containing a simplecontent column" and here is the sample xml. My actual xml file is very long with over 30MB and I can't edit the nodes manually and wondering if there is a alternate solution ?

<SpeedLineMenu>
  <Children>
    <ValueMealTreeRoot>
      <Name Type="String">Value Meals</Name>
      <SequenceID Type="Integer">0</SequenceID>
      <IsActive Type="Boolean">true</IsActive>
      <Children>
        <Group>
          <Name Type="String">Lunch Specials</Name>
          <SequenceID Type="Integer">3872</SequenceID>
          <IsActive Type="Boolean">true</IsActive>
          <Caption Type="String">Lunch Specials</Caption>
          <Children>
            <ValueMeal></ValueMeal>
          </Children>
         </Group>
      </Children>
     </ValueMealTreeRoot>
  </Children>
</SpeedLineMenu>
Kumar
  • 9
  • 2

1 Answers1

0

If there are recurrent xml elements present in your xml (in your case Children) element and you want to create POCO classes, you have to do it yourself. It isn't a very hard job though, and the "hand-made" classes often look better than auto-generated stuff.

[XmlRoot(ElementName = "SpeedLineMenu")]
public class SpeedLineMenuXml
{
    public SpeedLineMenuChildrenXml Children { get; set; }
}

public class SpeedLineMenuChildrenXml
{
    public ValueMealTreeRootXml ValueMealTreeRoot { get; set; }
}

public class ValueMealTreeRootXml
{
    public KeyXml Name { get; set; }
    public KeyXml SequenceID { get; set; }
    public KeyXml IsActive { get; set; }
    public ValueMealTreeRootChildrenXml Children { get; set; }

}

public class KeyXml
{
    [XmlAttribute]
    public string Type { get; set; }
    [XmlText]
    public string Value { get; set; }
}

public class ValueMealTreeRootChildrenXml
{
    public GroupXml Group { get; set; }
}

public class GroupXml
{
    public KeyXml Name { get; set; }
    public KeyXml SequenceID { get; set; }
    public KeyXml IsActive { get; set; }
    public KeyXml Caption { get; set; }
}

Usage:

var serializer = new XmlSerializer(typeof(SpeedLineMenuXml));
SpeedLineMenuXml root;
using (var reader = new StringReader(@"<SpeedLineMenu>
<Children>
  <ValueMealTreeRoot>
    <Name Type=""String"">Value Meals</Name>
    <SequenceID Type=""Integer"">0</SequenceID>
    <IsActive Type=""Boolean"">true</IsActive>
    <Children>
      <Group>
        <Name Type=""String"">Lunch Specials</Name>
        <SequenceID Type=""Integer"">3872</SequenceID>
        <IsActive Type=""Boolean"">true</IsActive>
        <Caption Type=""String"">Lunch Specials</Caption>
        <Children>
          <ValueMeal></ValueMeal>
        </Children>
       </Group>
    </Children>
   </ValueMealTreeRoot>
</Children>
</SpeedLineMenu>"))
{
  root = (SpeedLineMenuXml)serializer.Deserialize(reader);
}
Ondrej Svejdar
  • 21,349
  • 5
  • 54
  • 89