Как получить внутренний элемент XML и обновить его, используя Xpath или LINQ to XML - PullRequest
1 голос
/ 26 октября 2011

У меня есть XML как

<?xml version="1.0" ?> 
<Hospital>
  <DR>
    <Salary>1000</Salary>
    <bonus> 3 </bonus>
  </DR>
  <Nurse>
    <Shift> </Shift>
  </Nurse>
</Hospital> 

Я хочу найти либо медсестру, либо доктора, и обновить в нем значение определенного внутреннего элемента (обновление влияет на файл XML), используя индекс (0,1,2,3). Я также могу получить имя внутренних элементов, например, я хочу обновить зарплату внутреннего узла.

Как это сделать, используя XML и LINQ, учитывая, что внутренние элементы различаются по количеству и имени?

1 Ответ

2 голосов
/ 26 октября 2011

Исходя из вашего ответа на мой комментарий и вашей уверенности в вопросе о том, что вы хотите выбрать узлы по индексу, вот простой способ получить его.Предполагая, что у вашего XML есть несколько DR (без имен или других средств для их идентификации).Я использую XPATH здесь, потому что в вашем случае это может быть проще, чем LINQ.

При условии, что XML:

<Hospital> 
    <DR> 
        <Salary>1000</Salary> 
        <bonus> 3 </bonus> 
    </DR> 
    <DR> 
        <Salary>2000</Salary> 
        <bonus> 7 </bonus>  
    </DR> 
    <Nurse> 
        <Shift> </Shift> 
    </Nurse> 
</Hospital>

Вы можете выбрать второй узел, используя XPATH, следующим образом:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xmlString);
XPathNavigator navigator = xmlDocument.CreateNavigator();

XPathNavigator node = navigator.SelectSingleNode("/Hospital/DR[2]/Salary");
if (node != null)
    node.SetValue("new salary");

Обратите внимание, что индекс Xpath [] основан на 1, а не на 0.Поэтому DR [2] выбирает второй узел.

РЕДАКТИРОВАТЬ :

И в ответ на ваш второй вопрос, если у вас есть атрибут name вэлемент DR.Вы можете получить и обновить это значение так же, как и в предыдущем примере, все, что вам нужно изменить - это Xpath, указывающий на этот атрибут, как таковой:

/Hospital/DR[2]/@name
...