2013-03-06 13 views
-2

У меня есть файл XML со следующим содержимым:Как получить дочерние узлы 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> 

Пользователь должен ввести зарплату:

Console.WriteLine("Enter salary:"); 
int salary = int.Parse(Console.Readline()); 

В зависимости от заработной платы, мы должны рассчитать налог.

Я написал код, как это ..

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

я получаю все узлы в плитах. Как получить значение отдельного дочернего узла?

+1

С какой проблемой вы столкнулись? Чтение файла? Разбор XML-структуры? Используя оператор сравнения? –

+0

отредактировал @Matten, @ tim –

ответ

1

Вы можете цикл каждого из ваших slabs, а затем дополнительный запрос для дочерних элементов. Затем вы можете получить значение каждого элемента и делать с ними все, что хотите.

Что-то вроде этого:

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";//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 

Примечание: Приведенный выше код не проверяет, если значения действительны int s перед тем Паршин г. Если вы уверены в своей структуре XML, вы не найдете проблемы. Тем не менее, я бы рекомендовал разработать код немного дальше и с помощью int.TryParse() для проверки. Но я позволю вам поиграть с этим ;-)

+0

thats nice. я попробую это сейчас. –

1

Попробуйте

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

могу ли я написать вот так? XmlNodeList slabs = xml.SelectNodes ("// slab [lowerlimit> sal и upperlimit <= sal]"); –

+1

XmlNodeList slabs = xml.SelectNodes (string.Format (@ "// slab [lowerlimit> {0} и upperlimit> = {0}]", sal)); – Killo

+0

это означает, что «узел», который удовлетворяет этому уравнению, загружается в «плиты» ?? –

Смежные вопросы