【问题标题】:Generate Choice Node in C# XML在 C# XML 中生成选择节点
【发布时间】:2017-06-16 11:49:56
【问题描述】:

我有以下 Employee 类。我需要从这个类生成一个 xml,以便只允许一个属性。它是salary1 或salary2。

如果从数据库中得到的salary1大于Salary2,则生成的XML应该只包含salary1 XMLElement,并且生成的XML中应该没有salary2 XML元素

现在我在生成的 XML 中获取了这两个元素。

如果从数据库中得到的salary2大于Salary1,则生成的XML应该只包含salary2 XMLElement,并且生成的XML中应该没有salary1 XML元素。

我尝试过使用选择标识符,但无法理解。

公开课课程 {

    public class Employee 
    {

        public int Salary1 { get; set; }
        public int Salary2 { get; set; }

    }

       public static class Database
        {
            public static int Salary1 = 100;
            public static int Salary2= 50;
        }

    public static void Main(string[] args)
    {

        XmlSerializer xsSubmit = new XmlSerializer(typeof(Employee));

        Employee subReq;
        if (Database.Salary1 > Database.Salary2)
        {
            subReq = new Employee { Salary1 = Database.Salary1 };
        }
        else
        {
            subReq = new Employee { Salary2 = Database.Salary2 };
        }
        var xml = "";

        using (var sww = new StringWriter())
        {
            using (XmlWriter writer = XmlWriter.Create(sww))
            {
                xsSubmit.Serialize(writer, subReq);
                xml = sww.ToString(); // Your XML
            }
        }

        Console.WriteLine(xml);
        Console.ReadLine();

    }
}

}

【问题讨论】:

  • 要只获得一份薪水,请创建一个基类 Salary 并继承两个类 Salary1 和 Salary2。然后将 DataBase 中的属性设为基类 Salary,它将接受 Salary1 或 Salary2。
  • 为什么您没有一个 Salary 属性并使用符合条件的正确值对其进行初始化?

标签: c# xml xsd xsd-validation


【解决方案1】:

试试这个:

public class Employee
{
    private int salary;

    [XmlIgnore]
    public int Salary1 { get; set; }

    [XmlIgnore]
    public int Salary2 { get; set; }

    [XmlAttribute(AttributeName = "Salary")]
    public int SalaryToSerialize
    {
        get
        {
            salary = Math.Max(this.Salary1, this.Salary2);
            return salary;
        }
        set
        {
            salary = value;
        }    
    }
}

并按原样序列化对象。

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    感谢大家的回答和指导。但是我的场景由于某些原因我不能拥有像薪水这样的单一属性。将数据类型从 Int 更改为 String 解决了这个问题

    public static class Program
    {
    
        public class Employee
        {
    
            public string Salary1 { get; set; }
    
    
            public string Salary2 { get; set; }
    
    
    
    
    
        }
    
        public static class Database
        {
            public static int? Salary1 = 100;
            public static int? Salary2 = 50;
        }
    
        public static void Main(string[] args)
        {
    
            XmlSerializer xsSubmit = new XmlSerializer(typeof(Employee));
    
            Employee subReq;
            if (Database.Salary1 > Database.Salary2)
            {
                subReq = new Employee { Salary1 = Database.Salary1.ToString() };
            }
            else
            {
                subReq = new Employee { Salary2 = Database.Salary2.ToString() };
            }
            var xml = "";
    
            using (var sww = new StringWriter())
            {
                using (XmlWriter writer = XmlWriter.Create(sww))
                {
                    xsSubmit.Serialize(writer, subReq);
                    xml = sww.ToString(); // Your XML
                }
            }
    
            Console.WriteLine(xml);
            Console.ReadLine();
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多