C# 如何检索XML子节点?

C# 如何检索XML子节点?,c#,xml,C#,Xml,我有一个包含以下内容的XML文件: <incometax> <slab> <lowerlimit>0</lowerlimit> <upperlimit>200000</upperlimit> <percentage>0</percentage> </slab> <slab> <lowerlimit>200000</l

我有一个包含以下内容的XML文件:

<incometax>
  <slab>
    <lowerlimit>0</lowerlimit>
    <upperlimit>200000</upperlimit>
    <percentage>0</percentage>
  </slab>
  <slab>
    <lowerlimit>200000</lowerlimit>
    <upperlimit>500000</upperlimit>
    <percentage>10</percentage>
  </slab>
  <slab>
    <lowerlimit>500000</lowerlimit>
    <upperlimit>1000000</upperlimit>
    <percentage>20</percentage>
  </slab>
  <slab>
    <lowerlimit>1000000</lowerlimit>
    <upperlimit></upperlimit>
    <percentage>30</percentage>
  </slab>
</incometax>
根据工资,我们必须计算税金

我写了一些这样的代码

XmlDocument xml = new XmlDocument();
xml.Load("filepath");
XmlNodeList slabs = xml.SelectNodes("//slab");
我正在将所有节点放入板中。如何获取单个子节点的值?

试试这个

XmlNodeList slabs = xml.SelectNodes("//slab[lowerlimit > 1000 and upperlimit > 1000]");

您可以循环每个
,然后进一步查询子元素。然后,您可以获得每个元素的值,并对它们执行任何操作

大概是这样的:

XmlDocument xml = new XmlDocument();
xml.Load("filepath");
XmlNodeList slabs = xml.SelectNodes("//slab");

foreach(var slab in slabs)
{
    var nodeLowerLimit = slab.SelectSingleNode("lowerLimit");
    var nodeUpperLimit = slab.SelectSingleNode("upperLimit");
    var nodePercentageLimit = slab.SelectSingleNode("percentage");

    string lowerLimit = nodeLowerLimit.Value;
    string upperLimit = nodeUpperLimit.Value;
    string percentage= nodePercentageLimit.Value;

    //do something with these values
}

如果你想根据输入工资匹配一个百分比,那么你可以进行以下调整(当然@Killo建议了一个可能更好的替代方案-我以前没有使用过,但无法确认):

string percentageValue=“0”//只是违约
foreach(板中的var板)
{
var nodeLowerLimit=slab.SelectSingleNode(“lowerLimit”);
var nodeUpperLimit=slab.SelectSingleNode(“上限”);
var nodePercentageLimit=slab.SelectSingleNode(“百分比”);
字符串lowerLimit=nodeLowerLimit.Value;
字符串上限=nodeUpperLimit.Value;
字符串百分比=nodePercentageLimit.Value;
//检查表示“无限制”的空字符串,并检查sal是否在范围内
if((string.IsNullOrEmpty(lowerLimit)| | int.Parse(lowerLimit)=sal))
{
percentageValue=百分比;
}
}
//如果需要,可以在此处将percentageValue转换为int

注意:在解析之前,上述代码不会检查值是否有效。如果您确定XML结构,那么就不会发现问题。但是,我建议进一步开发代码并使用它进行验证。但我会让你玩一玩;-)

你有什么问题?读取文件?解析XML结构?使用比较运算符?我可以这样写吗?XmlNodeList slab=xml.SelectNodes(//slab[lowerlimit>sal和upperlimit XmlNodeList slab=xml.SelectNodes(string.Format(@//slab[lowerlimit>{0}和upperlimit>={0}]”,sal));这意味着满足此等式的“节点”被加载到“slab”中?您完全正确,xpath字符串(“//”)的开头这意味着它将检查所有节点中的所有板元素。很好。我现在就试试。
XmlDocument xml = new XmlDocument();
xml.Load("filepath");
XmlNodeList slabs = xml.SelectNodes("//slab");

foreach(var slab in slabs)
{
    var nodeLowerLimit = slab.SelectSingleNode("lowerLimit");
    var nodeUpperLimit = slab.SelectSingleNode("upperLimit");
    var nodePercentageLimit = slab.SelectSingleNode("percentage");

    string lowerLimit = nodeLowerLimit.Value;
    string upperLimit = nodeUpperLimit.Value;
    string percentage= nodePercentageLimit.Value;

    //do something with these values
}
string percentageValue = "0";//just a default
foreach(var slab in slabs)
{
    var nodeLowerLimit = slab.SelectSingleNode("lowerLimit");
    var nodeUpperLimit = slab.SelectSingleNode("upperLimit");
    var nodePercentageLimit = slab.SelectSingleNode("percentage");

    string lowerLimit = nodeLowerLimit.Value;
    string upperLimit = nodeUpperLimit.Value;
    string percentage= nodePercentageLimit.Value;

    //check for empty strings as meaning "no limit", and check sal is within range
    if((string.IsNullOrEmpty(lowerLimit) || int.Parse(lowerLimit) <= sal) &&
       (string.IsNullOrEmpty(upperLimit) || int.Parse(upperLimit) >= sal))
    {
        percentageValue = percentage;
    }
}
//here you can convert the percentageValue to an int if you need to