【问题标题】: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);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-18
      • 2014-07-01
      • 2014-09-08
      • 2011-10-28
      • 1970-01-01
      • 2010-12-15
      • 2016-10-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多