2015-11-23 50 views
0

我正在從xml文件創建一個類文件,但xsd抱怨說「不能添加嵌套關係或元素列到包含簡單內容列的表」,這裏是示例xml。我的實際XML文件非常長,超過30MB,我無法手動編輯節點,並想知道是否有其他解決方案?從xml文件自動生成一個類

<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> 

回答

0

如果不存在復發的XML元素在XML(在你的情況Children)元素,你要創建的POCO類,你必須自己做。雖然這不是一件非常艱苦的工作,而且「手工製作」的課程通常比自動生成的東西好看。

[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; } 
} 

用法:

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); 
}