【问题标题】:Auto generate a class from a xml file从 xml 文件自动生成一个类
【发布时间】:2016-02-25 04:54:11
【问题描述】:
我正在从 xml 文件创建一个类文件,但 xsd 抱怨说“无法将嵌套关系或元素列添加到包含 simplecontent 列的表中”,这是示例 xml。我的实际 xml 文件非常长,超过 30MB,我无法手动编辑节点,想知道是否有替代解决方案?
<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>
【问题讨论】:
标签:
c#
asp.net
xml
auto-generate
xsd.exe
【解决方案1】:
如果您的 xml(在您的情况下为 Children)元素中存在重复的 xml 元素,并且您想要创建 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);
}