如何检查 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();
}
}
我想在 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();
}
}