如何检查 xml 值的条件?

How to check condition of xml value?

我想在 XML 应用程序中实施两个规则。

1 If weight is bigger then 10 then by name Department has to be written: Big

您可以创建一个 class 包裹并根据函数调用的重量和价值确定部门

public class Parcel
{
    public string Name { get; set; }
    public string PostalCode { get; set; }
    public decimal Weight { get; set; }
    public decimal Value { get; set; }
    public string Department => GetDepartment();
    private string GetDepartment()
    {
        string _department = "";
        if (this.Weight <= 1)
        {
            _department = "Mail";
        }
        else if (this.Weight > 1 && this.Weight <= 10)
        {
            _department = "Regular";
        }
        else if (this.Weight > 10)
        {
            _department = "Heavy";
        }
        else
        {
            _department = "Unknown";
        }

        if (this.Value > 1000)
        {
            _department += ",Insurance";
        }

        return _department;
    }
}

您的XDcoument将如下所示

XDocument xdoc = XDocument.Load($"XMLFile1.xml");

var items = xdoc.Descendants("Parcel")
                .Select(xelem => new Parcel
                {
                    Name = xelem.Element("Sender").Element("Name").Value,
                    PostalCode = xelem.Element("Sender").Element("Address").Element("PostalCode").Value,
                    Weight = Convert.ToDecimal(xelem.Element("Weight").Value),
                    Value = Convert.ToDecimal(xelem.Element("Value").Value)
                });

foreach (var item in items)
{
    Console.WriteLine($"{ item.Name} - { item.PostalCode} - { item.Weight} - { item.Value} - { item.Department}");
}

输出

Klaas - 2402AE - 0.02 - 0.0 - Mail
ykken groot B.V. - 2497GA - 2.0 - 0.0 - Regular
seti - 2497GA - 100.0 - 2000.0 - Heavy,Insurance
Aad - 2353HS - 11 - 500 - Heavy

为什么不扩展您的 Parcel class 以拥有一个 'DepartmentSize' 属性,它处理大小:

class Parcel
{
     public string DepartmentSize 
     {
         var parts = new List<string>();
         if(_Weight> 10)
             parts.Append("Big");
         if(_Value > 1000) 
             parts.Append("Large");
         return string.Join(",", parts);
     }
 }

然后你可以这样输出尺寸:

Console.WriteLine($"... Department: {item.DepartmentSize}");

最好让Department属性自己计算它的值(computed属性)。由于计算发生在您期望的位置,因此这更清晰、更易读。否则,在计算依赖于多个 属性 的场景中,您会发现自己在每个参与的 属性.
中编写重复的计算代码 因此,在请求值时执行计算 - 即调用计算的 属性 的 Get() 时 - 而不是当 partzicipating 属性已更改时。如果计算比较复杂,那么遵循这个规则也会提高性能。

还要避免直接在 属性 的 Set()/Get() 中实现这样的过滤器。将其移至方法。

我还建议使用 switch 语句或 switch 表达式,因为这比一长串 if-else 块更具可读性,因此更易于维护。使用 C# 9 时,switch-expression 可以成为一个强大的工具,可以使用易于阅读的语法进行过滤。

此外,由于您尝试为打印输出创建的字符串是实际 Parcel 实例的固定 string 表示,覆盖 Parcel.ToString.

您的包裹 class 应如下所示:

Parcel.cs

public class Parcel
{
  public override string ToString() 
    => $"Name: {this.Name} - Postal code {this.PostalCode} - Weight {this.Weight} - Value {this.Value} - Department {this.Department}";

  public string Name { get; set; }
  public string PostalCode { get; set; }
  public decimal Weight { get; set; }
  public decimal Value { get; set; }
  public string Department => CreateDepartmentValue();

  private string CreateDepartmentValue()
  {
    var result = string.Empty;

    switch (this.Weight)
    {
      case decimal weightInKiloGrams when weightInKiloGrams <= 1: result = "Mail"; break;
      case decimal weightInKiloGrams when weightInKiloGrams <= 10: result = "Regular"; break;
      case decimal weightInKiloGrams when weightInKiloGrams > 10: result = "Heavy"; break;
    };


    switch (this.Value)
    {
      case decimal value when value > 1000: result += ", Insurance"; break;
    };

    return result;
  }
}

使用示例

public class Program
{
  static void Main(string[] args)
  {

    XDocument xdoc = XDocument.Load($"Container.xml");
    var items = ...;

    foreach (var item in items)
    {
      // Call ToString() implicitly
      Console.WriteLine(item);
      Console.WriteLine("*********************************************************************");
    }

    Console.ReadLine();
  }
}